我如何使用C#解析JSON?

我有以下代码:

var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);

responsecontent内容中的输入是JSON,但未正确解析为对象。 我应该如何正确地反序列化它?


我假设你没有使用Json.NET(Newtonsoft.Json NuGet包)。 如果是这种情况,那么你应该尝试一下。

它具有以下特点:

  • LINQ to JSON
  • JsonSerializer用于快速将.NET对象转换为JSON并返回
  • Json.NET可以选择性地生成格式良好的缩进JSON以进行调试或显示
  • 像JsonIgnore和JsonProperty这样的属性可以添加到一个类中,以定制一个类的序列化方式
  • 能够将JSON转换为XML和从XML转换
  • 支持多种平台:.NET,Silverlight和Compact Framework
  • 看下面的例子。 在这个例子中, JsonConvert类用于将对象转换为JSON并从中转换。 它有两个静态方法用于此目的。 它们是SerializeObject(Object obj)DeserializeObject<T>(String json)

    Product product = new Product();
    product.Name = "Apple";
    product.Expiry = new DateTime(2008, 12, 28);
    product.Price = 3.99M;
    product.Sizes = new string[] { "Small", "Medium", "Large" };
    
    string json = JsonConvert.SerializeObject(product);
    //{
    //  "Name": "Apple",
    //  "Expiry": "2008-12-28T00:00:00",
    //  "Price": 3.99,
    //  "Sizes": [
    //    "Small",
    //    "Medium",
    //    "Large"
    //  ]
    //}
    
    Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
    

    正如在这里回答 - 将JSON反序列化为C#动态对象?

    使用Json.NET非常简单:

    dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
    
    string name = stuff.Name;
    string address = stuff.Address.City;
    

    或者使用Newtonsoft.Json.Linq:

    dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
    
    string name = stuff.Name;
    string address = stuff.Address.City;
    

    以下是一些使用第三方库的选项:

    // For that you will need to add reference to System.Runtime.Serialization
    var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }"), new System.Xml.XmlDictionaryReaderQuotas());
    
    // For that you will need to add reference to System.Xml and System.Xml.Linq
    var root = XElement.Load(jsonReader);
    Console.WriteLine(root.XPathSelectElement("//Name").Value);
    Console.WriteLine(root.XPathSelectElement("//Address/State").Value);
    
    // For that you will need to add reference to System.Web.Helpers
    dynamic json = System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
    Console.WriteLine(json.Name);
    Console.WriteLine(json.Address.State);
    

    有关System.Web.Helpers.Json的更多信息,请参阅链接。

    更新 :现在获取Web.Helpers的最简单方法是使用NuGet包。


    如果你不关心早期的Windows版本,你可以使用Windows.Data.Json命名空间的类:

    // minimum supported version: Win 8
    JsonObject root = Windows.Data.Json.JsonValue.Parse(jsonString).GetObject();
    Console.WriteLine(root["Name"].GetString());
    Console.WriteLine(root["Address"].GetObject()["State"].GetString());
    
    链接地址: http://www.djcxy.com/p/20071.html

    上一篇: How can I parse JSON with C#?

    下一篇: How to ignore a property in class if null, using json.net