使用动态变量解析JSON块

我从URL抓取JSON对象并使用JSON.NET解析它。 我能够用定义的变量解析数据块就好了,但是当涉及var:value的随机收集时 – 我被卡住了。

示例(松散类型):

{"FNAME":"joe","LNAME":"doe",
"BodyType":{"height":180,"weight":"200","race":"white","hair":"black"},
"BELONGINGS":{"shirt":"black","Money":15,"randomThing":"anyvar"},
"Signs":{"tattoo":0,"scar":"forehead","glasses":"dorky"}
}

我正在投这个

Class Person
{
public string FNAME;
public string LNAME;
public BodyType bodyType;
public ????? belongings;
public ????? signs;
}
如果我无法预测其属性,我该如何处理物品和标志?

好吧,他们肯定是JSON对象,对,JSON对象是将字符串映射到某些东西的关联数组。 所以我将它们表示为Dictionary – 一个字符串映射到某些东西。

有两种方法可以在不知道运行时的内容的情况下处理它们。

第一种方法是使用JSON.Net的JObject ,它将处理你提到的情况,以及层次结构。

第二种方法是使用System.Dynamic的ExpandoObject ,这是最新版本的JSON.Net新支持的。 不幸的是,它并没有完全处理层次结构,但JSON.Net在遇到时会回到JObject支持它们。 为了您的目的,它可能更直接。

以下是您提供的代码段和定义的示例。 另请注意, ExpandoObject可直接转换为IDictionary ,而JObject具有访问属性的显式方法。

Person对应于ExpandoObject ,JPerson对应于JObject

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Dynamic; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; namespace YourFavoriteNamespace { public class JPerson { public string FNAME; public string LNAME; public BodyType bodyType; public JObject belongings; public JObject signs; } public class Person { public string FNAME; public string LNAME; public BodyType bodyType; public ExpandoObject belongings; public ExpandoObject signs; } public class BodyType { public int height; public int weight; public string race; public string hair; } class Program { static void DumpDynamic(dynamic d) { IDictionary dynMap = (IDictionary)d; foreach (string key in dynMap.Keys) { Console.WriteLine(" {0}={1} (type {2})", key, dynMap[key], null == dynMap[key] ? "null" : dynMap[key].GetType().Name); } } static void DumpJProperties(JObject jo) { var props = jo.Properties(); foreach (JProperty prop in props) { Console.WriteLine(" {0}={1} (type {2})", prop.Name, prop.Value, null == prop.Value ? "null" : prop.Value.GetType().Name); } } static void DumpPerson(Person p) { Console.WriteLine("Person"); Console.WriteLine(" FNAME={0}", p.FNAME); Console.WriteLine(" LNAME={0}", p.LNAME); Console.WriteLine("Person.BodyType"); Console.WriteLine(" height={0}", p.bodyType.height); Console.WriteLine(" weight={0}", p.bodyType.weight); Console.WriteLine(" race ={0}", p.bodyType.race); Console.WriteLine(" hair ={0}", p.bodyType.hair); Console.WriteLine("Person.belongings"); DumpDynamic(p.belongings); Console.WriteLine("Person.signs"); DumpDynamic(p.signs); } static void DumpJPerson(JPerson p) { Console.WriteLine("Person"); Console.WriteLine(" FNAME={0}", p.FNAME); Console.WriteLine(" LNAME={0}", p.LNAME); Console.WriteLine("Person.BodyType"); Console.WriteLine(" height={0}", p.bodyType.height); Console.WriteLine(" weight={0}", p.bodyType.weight); Console.WriteLine(" race ={0}", p.bodyType.race); Console.WriteLine(" hair ={0}", p.bodyType.hair); Console.WriteLine("Person.belongings"); DumpJProperties(p.belongings); Console.WriteLine("Person.signs"); DumpJProperties(p.signs); } static void DoSimplePerson() { string initJson = "{\"FNAME\":\"joe\",\"LNAME\":\"doe\",\"BodyType\":{\"height\":180,\"weight\":\"200\",\"race\":\"white\",\"hair\":\"black\"},\"BELONGINGS\":{\"shirt\":\"black\",\"Money\":15,\"randomThing\":\"anyvar\"},\"Signs\":{\"tattoo\":0,\"scar\":\"forehead\",\"glasses\":\"dorky\"}}"; Person p = JsonConvert.DeserializeObject(initJson); DumpPerson(p); Console.ReadLine(); } static void DoComplexPerson() { string initJson = "{\"FNAME\":\"joe\",\"LNAME\":\"doe\",\"BodyType\":{\"height\":180,\"weight\":\"200\",\"race\":\"white\",\"hair\":\"black\"},\"BELONGINGS\":{\"shirt\":\"black\",\"Money\":15,\"randomThing\":\"anyvar\"},\"Signs\":{\"tattoo\":0,\"scar\":\"forehead\",\"glasses\":[\"dorky\",\"hipster\"]}}"; Person p = JsonConvert.DeserializeObject(initJson); DumpPerson(p); Console.ReadLine(); } static void DoJPerson() { string initJson = "{\"FNAME\":\"joe\",\"LNAME\":\"doe\",\"BodyType\":{\"height\":180,\"weight\":\"200\",\"race\":\"white\",\"hair\":\"black\"},\"BELONGINGS\":{\"shirt\":\"black\",\"Money\":15,\"randomThing\":\"anyvar\"},\"Signs\":{\"tattoo\":0,\"scar\":\"forehead\",\"glasses\":\"dorky\"}}"; JPerson p = JsonConvert.DeserializeObject(initJson); DumpJPerson(p); Console.ReadLine(); } static void Main(string[] args) { DoSimplePerson(); DoComplexPerson(); DoJPerson(); } } }