【问题标题】:How do you parse a JSON.NET file without a defined structure?如何解析没有定义结构的 JSON.NET 文件?
【发布时间】:2012-07-28 07:35:44
【问题描述】:

我正在使用来自 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。我一直在尝试使用不同的反序列化方法、动态对象以及使用 .Ancestor 之类的函数进行简单的解析,但我没有发现任何有用的东西。任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net dictionary json.net deserialization


    【解决方案1】:

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

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

    您可以遍历子节点,或像这样搜索其他节点:

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

    【讨论】:

    • 像这样:JObject["doc"]["info"]["document"]
    • 是的,我最初使用这种方法,但我想要一种在不知道事物名称的情况下从子节点等获取所有信息的方法。由于输出发生变化,如果我不确切知道会发生什么,我想要一种获取所有信息的方法
    • 哦,那个方法 JToken info = rootObject.SelectToken("info");返回一个空令牌...
    • 对空令牌错误感到抱歉。并没有实际测试。应该是 SelectToken("doc.info")?
    【解决方案2】:

    Json.NET 支持 Newtonsoft.Json.Linq 命名空间下的 LINQ to JSON

    The example 使用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
    

    【讨论】:

      【解决方案3】:

      您可以使用DeserializeObject,它本质上返回一个Dictionary&lt;string, object&gt;

      例如:

      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。

      【讨论】:

      • 这将如何工作?这一行 'Dictionary yay = JsonConvert.DeserializeObject(responseFromServer);'返回错误无法将类型 'object' 隐式转换为 'System.Collections.Generic.Dictionary'。存在显式转换(您是否缺少演员表?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2018-05-24
      • 2016-12-27
      相关资源
      最近更新 更多