我有一个简单的JSON键/值列表,通过POST发送回ASP.NET。例子:
{ "key1": "value1", "key2": "value2"}
我没有试图反序列化为强类型的.NET对象
我只需要一个普通的旧字典(Of String,String),或者一些等价的东西(哈希表,字典(OfString,Object),老式的StringDictionary——见鬼,一个二维字符串数组对我来说很有用。
我可以使用ASP.NET 3.5中可用的任何东西,也可以使用流行的Json.NET(我已经在使用它对客户端进行序列化)。
显然,这两个JSON库都没有这种开箱即用的能力——它们完全专注于通过强契约实现基于反射的反序列化。
有什么想法吗?
限制:
我不想实现我自己的JSON解析器尚无法使用ASP.NET 4.0希望远离旧的、不推荐使用的JSON ASP.NET类
System.Text.Json
这现在可以使用.NET Core 3.0内置的System.Text.Json来完成。现在可以在不使用第三方库的情况下反序列化JSON。
var json = @"{""key1"":""value1"",""key2"":""value2""}";
var values = JsonSerializer.Deserialize<Dictionary<string, string>>(json);
如果使用.NET标准或.NET Framework,也可以在NuGet包System.Text.Json中获得。
确保阅读并理解:
https://github.com/dotnet/runtime/issues/30452
我建议使用.NET4.5中的System.Runtime.Serialization.Json。
[DataContract]
public class Foo
{
[DataMember(Name = "data")]
public Dictionary<string,string> Data { get; set; }
}
然后这样使用:
var serializer = new DataContractJsonSerializer(typeof(List<Foo>));
var jsonParams = @"{""data"": [{""Key"":""foo"",""Value"":""bar""}] }";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonParams));
var obj = serializer.ReadObject(stream);
Console.WriteLine(obj);
这是我使用System.Text.Json的解决方案。您可以获得嵌套对象的Json字符串,然后可以将其转换为所需类型。
public static Dictionary<string,string> JsonToDictionary(this string json)
{
var objectValues = JsonSerializer.Deserialize<Dictionary<string, object>>(json);
var stringValues = objectValues.Select(o => new KeyValuePair<string, string>(o.Key, o.Value?.ToString()));
return stringValues.ToDictionary(pair => pair.Key, pair => pair.Value);
}
以下是从嵌套对象获取值的用法示例:
var result= json.JsonToDictionary()["outerField"]
.JsonToDictionary()["innerField"];
请注意,此解决方案不包括以数组形式开始的json对象,如[12,13]。这些对象可以在开头作为数组读取,然后可以在每个项上应用扩展方法,以防这些项是具有自己财产的复杂对象。