我怎样才能parsing与C#的JSON?
我有以下代码
var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);
responsecontent
的input是JSON,但没有正确parsing成JSON对象。 我应该如何正确地序列化它?
我假设你不使用Json.NET 。 如果是这样的话,那么你应该尝试一下。
它具有以下特点:
- LINQ to JSON
- JsonSerializer用于快速将.NET对象转换为JSON并返回
- Json.NET可以select性地生成格式良好的,缩进的JSON以进行debugging或显示
- 像JsonIgnore和JsonProperty这样的属性可以被添加到一个类来定制一个类是如何序列化的
- 能够将JSON转换为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#dynamic对象?
使用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()); 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());
如果.NET 4可用,请查看: http : //visitmix.com/writings/the-rise-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);
最后一个Console.WriteLine是相当甜蜜的…
另一个本地解决scheme,它不需要任何第三方库,但对System.Web.Extensions的引用是JavaScriptSerializer。 从3.5开始,这不是一个新的内置function。
using System.Web.Script.Serialization;
..
JavaScriptSerializer serializer = new JavaScriptSerializer(); objectString = serializer.Serialize(new MyObject());
然后回来
MyObject o = serializer.Deserialize<MyObject>(objectString)
你也可以看看DataContractJsonSerializer
从msdn网站下面我应该认为帮助提供一些原生function为您正在寻找。 请注意,它是为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命名空间。
试试下面的代码:
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(); } }
我认为我见过的最好的答案是@MD_Sayem_Ahmed。
你的问题是“我怎样才能用C#parsingJson”,但是你似乎想解码Json。 如果你想解码,艾哈迈德的答案是好的。
如果您正在尝试在ASP.NET Web Api中实现此function,最简单的方法是创build一个数据传输对象来存储您要分配的数据:
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 }
当我在Web API中工作时,这帮了我很大的忙,让我的生活变得非常简单。
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"]);