我有以下需要反序列化的Json字符串。
{"123456789": {"short_description":"Delivered", "detail_description":"Your item has been delivered" } }
第一个字段“ 123456789”是一个ID号,因此基本上该值可以根据要查询的数据而有所不同。
我在Visual Studio中使用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结构的对象。如果您知道期望使用什么结构,那么无需编写自定义解析器或目标对象类型就非常有用。
然后,您可以枚举Map的键,例如,找到变化的键。然后,包装程序或转换程序将为其余的应用程序层提供一致的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<string, object>; // Handle errors, but I am not var firstPair = m.First(); var detail = firstPair.Value as Map<string, object>; var dummy = new Order() { OrderNum = firstPair.Key, ShortDesc = detail["short_description"].ToString(); Desc = detail["detail_description"].ToString(); } return dummy; } }