如何用C解析JSON?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (116)

以下代码

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

responseContent中的输入是JSON,但没有正确解析成JSON对象。 我应该如何正确地序列化它?

提问于
用户回答回答于
var result = controller.ActioName(objParams);
IDictionary<string, object> data = (IDictionary<string, object>)new System.Web.Routing.RouteValueDictionary(result.Data);
Assert.AreEqual("Table already exists.", data["Message"]);
用户回答回答于

你的问题是“如何用C#解析JSON”,但你似乎想要解码JSON。

如果你想在ASP.NET Web Api中完成这一任务。最简单的方法是创建一个数据传输对象,该对象保存要分配的数据:

public class MyDto{
    public string Name{get; set;}
    public string Value{get; set;}
}

只需将application/json头添加到请求中(例如,如果您使用Fiddler)。然后在ASP.NET Web API中使用。如下所示:

//controller method -- assuming you want to post and return data
public MyDto Post([FromBody] MyDto myDto){
   MyDto someDto = myDto;
   /*ASP.NET automatically converts the data for you into this object 
    if you post a json object as follows:
{
    "Name": "SomeName",
      "Value": "SomeValue"
}
*/
   //do some stuff
}
用户回答回答于
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");

            JArray array = new JArray();
            using (var twitpicResponse = (HttpWebResponse)request.GetResponse())
            {

                using (var reader = new StreamReader(twitpicResponse.GetResponseStream()))
                {
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    var objText = reader.ReadToEnd();

                    JObject joResponse = JObject.Parse(objText);
                    JObject result = (JObject)joResponse["result"];
                    array = (JArray)result["Detail"];
                    string statu = array[0]["dlrStat"].ToString();
                }

            }
用户回答回答于

以下为MSDN网站为你寻找的一些能给你提供帮助的方法。请注意,它是为Windows 8指定的。下面列出了来自该站点的一个此类示例。

JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");

它利用了Windows.Data.JSON 来命名 namespace。

用户回答回答于

另一个本地解决方案,不需要任何第三方库,但对System.Web.Extensions的引用是通过JavaScriptSerializer。

using System.Web.Script.Serialization;
JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());
MyObject o = serializer.Deserialize<MyObject>(objectString)
用户回答回答于

如果你可以使用.NET4,请查看:http://visitMi.com/Writes/the-rever-of-json(Archive.org)

以下为代码片段:

WebClient webClient = new WebClient();
dynamic result = JsonValue.Parse(webClient.DownloadString("https://api.foursquare.com/v2/users/self?oauth_token=XXXXXXX"));
Console.WriteLine(result.response.user.firstName);
用户回答回答于

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

// 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

更新:现在最简单的方法是是使用Nuget package来获取Web.Helpers

如果你不关心早期的windows版本,则可以使用Windows.Data.Json命名namespace:

// 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());
用户回答回答于

将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;
用户回答回答于

JSON.NET(Newtonsoft.Json NuGet package)

它具有以下特点:

  1. LINQ to JSON
  2. 用于快速转换您的.NET对象到JSON并再次返回
  3. JSON.NET可以选择生成格式良好的缩进JSON,以进行调试或显示。
  4. 可以将JsonIgnore和JsonProperty等属性添加到类中,以自定义类如何序列化
  5. 能够将JSON转换成XML
  6. 支持多个平台:.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);

扫码关注云+社区

领取腾讯云代金券