我从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;
}
答案 0 :(得分:8)
有两种方法可以在不知道运行时的内容的情况下处理它们。
第一种方法是使用JSON.Net的JObject
,它将处理您提到的案例以及层次结构。
第二种方法是使用System.Dynamic的ExpandoObject
,这是最新版本的JSON.Net新支持的。不幸的是,它并没有完全处理层次结构,但JSON.Net在遇到时会回到JObject
以支持它们。为了您的目的,它可能更直接。
以下是您提供的代码段和定义的示例。另请注意,ExpandoObject
可直接转换为IDictionary<string, object>
,而JObject
则具有访问属性的显式方法。
人对应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<string, object> dynMap = (IDictionary<string, object>)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<Person>(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<Person>(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<JPerson>(initJson);
DumpJPerson(p);
Console.ReadLine();
}
static void Main(string[] args)
{
DoSimplePerson();
DoComplexPerson();
DoJPerson();
}
}
}
答案 1 :(得分:1)
嗯,他们肯定是JSON对象,对,JSON对象是将字符串映射到某些东西的关联数组。所以我将它们表示为Dictionary<string, dynamic>
- 一个字符串映射到某些东西。