如何在没有定义结构的情况下解析JSON.NET文件



我使用的是来自OpenCalais的API,它为我提供了一个包含大量json对象的json字符串。问题是,根据我传递给API的内容,JSON字符串的结构会发生变化,这意味着我不能对我可以创建的自定义类强制取消分类。另一个问题是输出不是键值形式,而是一个复杂的对象结构。下面是输出的一个例子-

{"doc":
{"info":
{"allowDistribution":"true",
"allowSearch":"true",
"calaisRequestID":"c1cdd79a-ed89-8431-138c-50e8a37100f9",
"externalID":"17cabs901",
"id":"http://id.opencalais.com/0RCcU306*HTR05*7HlUb5A",
"docId":"http://d.opencalais.com/dochash-1/6188237f-a2a5-3263-95b7-ea894ba98298",
"document":"Bill Gates worked at Microsoft from 2008 to 2011. He is also married to Melinda Gates.",
"docTitle":"",
"docDate":"2012-07-26 15:51:00.885",
"externalMetadata":"",
"submitter":"ABC"}

所以你可以看到这里有多个级别的对象,并且没有键值结构。我从这段代码中需要的基本上是字典中的所有名称/值信息。然后我可以根据相关信息的关键字进行排序。如果我也能以某种方式获取对象值的父对象,那也会很酷。例如,我想要的输出是key:allowSearch,value:true,parent:info。我一直在尝试使用不同的反序列化方法、动态对象,以及使用.Acestor和我没有发现任何有用的函数进行简单解析。如有任何帮助,我们将不胜感激。

您看过JSON.NET吗?它可以动态解析JSON,然后可以对其进行迭代:

using Newtonsoft.Json.Linq;
JObject rootObject = JObject.Parse(jsonString);

您可以迭代子节点,或者搜索其他节点,如下所示:

JToken info = rootObject.SelectToken("info");

Json.NET支持Newtonsoft.Json.Linq命名空间下的LINQ到Json。

使用JObject 的示例

JObject o = JObject.Parse(@"{'CPU': 'Intel','Drives': ['DVD read/writer','500 gigabyte hard drive']}");
string cpu = (string)o["CPU"];
// Intel
string firstDrive = (string)o["Drives"][0];
// DVD read/writer
IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive

您可以使用本质上返回Dictionary<string, object>的DeserializeObject。

例如:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> myGraph = (Dictionary<string, object>)serializer.DeserializeObject(myJson);

要阅读myGraph字典中的内容,您必须对每一步都进行投射。

例如:

Dictionary<string, object> doc = (Dictionary<string, object>)myGraph["doc"];
Dictionary<string, object> info = (Dictionary<string, object>)doc["info"];
string externalID = (string)info["externalID"];

我相信你可以对它进行一点通用化,但我认为这应该适用于你发布的json。

相关内容

  • 没有找到相关文章

最新更新