C#反序列化动态JSON

我有以下需要反序列化的Json字符串。

{"123456789": {"short_description":"Delivered", "detail_description":"Your item has been delivered" } } 

第一个字段“123456789”是一个id号,所以基本上这个值可能会有所不同,具体取决于被查询的数据。

我在视觉工作室使用C#。 显然,因为第一个字段的值可以更改,所以我不能使用预定义的类来反序列化JSON,因为该字段将用作类名,但字段值与类名不匹配。

有没有办法将其反序列化为某种动态类但仍然访问字段,就好像它是一个预定义的类?

或者有没有办法将其反序列化为预定义的类,即使类名不匹配?

提供此数据的服务是第三方服务,因此我无法控制它。

这是我在生产代码中使用的一种方式。 它可能不完美,但它完成了工作。

 using using System.Web.Script.Serialization; // ..... public object GetJson(string url) { var json = Get(url); // I have code that makes this work, it gets a JSON string try { var deserializer = new JavaScriptSerializer(); var result = deserializer.DeserializeObject(json); return result; } catch (ArgumentException e) { // Error handling.... } } 

您收到的对象将是通用的Map,List或其他任何内容,具体取决于JSON的结构。 如果您知道期望的结构,那么在不编写自定义解析器或目标对象类型的情况下,这非常有用。

然后,您可以枚举地图的键,例如,找到不同的键。 然后,包装器或转换将为应用程序层的其余部分提供一致的API。 就像是:

 public class Order { public string OrderNum { private set; get; } public string ShortDesc { private set; get; } public string Desc { private set; get; } public static Order FromJson(object jsonResult) { var m = jsonResult as Map; // Handle errors, but I am not var firstPair = m.First(); var detail = firstPair.Value as Map; var dummy = new Order() { OrderNum = firstPair.Key, ShortDesc = detail["short_description"].ToString(); Desc = detail["detail_description"].ToString(); } return dummy; } } 

我喜欢上面的回答,所以我重构了一下。 您需要引用System.Web.Extensions.dllSystem.Web.Script.Serialization

这是class级:

 public class Order { public string OrderNum { private set; get; } public string ShortDesc { private set; get; } public string Desc { private set; get; } public static Order FromJson(string jsonResult) { JavaScriptSerializer js = new JavaScriptSerializer(); // Should deserialize right to Dictionary // var result = ((Dictionary)js.Deserialize(jsonResult)).First(); var result = js.Deserialize>(jsonResult).First(); var detail = (Dictionary)result.Value; return new Order() { OrderNum = result.Key, ShortDesc = detail["short_description"].ToString(), Desc = detail["detail_description"].ToString() }; } } 

以及如何称呼它:

 string json = "{\"123456789\": {\"short_description\":\"Delivered\", \"detail_description\":\"Your item has been delivered\" } }"; Order o = Order.FromJson(json); 

但是,您需要自己实现error handling。