使用动态变量解析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(); } } }
- 在C#中合并2个文本文件
- Console.ReadKey()与multithreading的奇怪行为
- ASP.NET中的全局error handling
- 查找没有WMI的USB驱动器的序列号
- 如何在Web服务中初始化静态变量
- 访问HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData
- 如何使用NHibernate Mapping.ByCode在非主键字段上加入表?
- 如何将数据从视图传递到ASP.NET MVC中的UserControl?
- EF 7 beta 6:EF 7中具有一对多关系的实体