我有一个简单的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]。这些对象可以在开头作为数组读取,然后可以在每个项上应用扩展方法,以防这些项是具有自己财产的复杂对象。

我确实发现.NET有一种内置方式,可以通过3.5 System.Web.Extensions程序集中的System.Web.Script.Serialization.JavaScriptSerializer类型将JSON字符串转换为Dictionary<string,Object>。使用方法DeserializeObject(String)。

我在对静态.net页面方法进行内容类型为“application/json”的ajax发布(通过jquery)时偶然发现了这一点,并看到该方法(只有一个Object类型的参数)神奇地收到了这个字典。

对于那些在互联网上搜索并偶然发现这篇文章的人,我写了一篇关于如何使用JavaScriptSerializer类的博客文章。

阅读更多。。。http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/

下面是一个示例:

var json = "{\"id\":\"13\", \"value\": true}";
var jss = new JavaScriptSerializer();
var table = jss.Deserialize<dynamic>(json);
Console.WriteLine(table["id"]);
Console.WriteLine(table["value"]);

马克·伦德尔(Mark Rendle)将此作为评论发布,我想将其作为答案发布,因为这是迄今为止唯一一个能够从Google reCaptcha响应中返回成功和错误代码json结果的解决方案。

string jsonReponseString= wClient.DownloadString(requestUrl);    
IDictionary<string, object> dict = new JavaScriptSerializer().DeserializeObject(jsonReponseString) as IDictionary<string, object>;

再次感谢,马克!