【问题标题】:Deserializing JSON using JSon.NET with dynamic data使用带有动态数据的 JSon.NET 反序列化 JSON
【发布时间】:2012-01-05 05:20:19
【问题描述】:

我正在尝试将一些 JSON 数据反序列化为应用程序的对象。到目前为止,一切都很好,因为 JSON 数据的属性是静态的(带有值的键)。现在我得到了一个关键是动态数据的结果。

这是一个示例 JSON 网址:

http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info

生成的 JSON 是:

{ "query" : { "pages" : { "6695" : { "counter" : "",
          "lastrevid" : 468683764,
          "length" : 8899,
          "ns" : 0,
          "pageid" : 6695,
          "title" : "Citadel",
          "touched" : "2012-01-03T19:16:16Z"
        } } } }

好的,这很好,只是我无法将“页面”数据反序列化为对象。如果我要为页面定义一个类,它必须如下所示:

public class 6695
{
    public string counter { get; set; }
    public int lastrevid { get; set; }
    public int length { get; set; }
    public int ns { get; set; }
    public int pageid { get; set; }
    public string title { get; set; }
    public string touched { get; set; }
}

为了反序列化内容(使用 JsonConvert.Deserialize(jsondata)),我们都知道我们不能有一个名为 6695 的类。不仅如此,类的名称必须不同(例如 pageid =7145 必须是 7145 类)。

如果我使用 JObject.Parse(content) 之类的东西,然后以 JArrays 的形式访问项目,我似乎可以提取一些值,但它非常难看,我仍然坚持尝试从 pages 数组中取出数据。

正在寻找可以帮助解决此问题的人。我认为这并不少见,只是我以前遇到过的不是 JSON 数据,不知道如何处理。

谢谢!

PS 忘了提到这是在 Windows Phone 7 上,所以“动态”不可用!

【问题讨论】:

  • 不会是 6695,只是属性名,而不是类名吗?仍然是一个问题,但也许您可以将数字属性搜索并替换为某个固定名称。我不确定 Json.NET 如何处理这个问题,但也许你可以尝试将其反序列化为特定对象类型的字典?
  • 我参加这个聚会可能有点晚了,但是 newtonsoft 库有 JObject 用于这个 ... var obj = JObject.Parse(jsonString);基本上将数据视为复杂的嵌套字典,类似于 javascript 在浏览器中的行为方式。你得到一个“JObject”的实例,它允许你使用数组语法访问所有内容,例如: var page = obj["pages"]["6695"]

标签: json windows-phone-7 json.net deserialization


【解决方案1】:

最简单的方法。在这种特殊情况下,可能会去dynamic

dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
var lastRevId = data.query.pages["6695"].lastrevid;

您可以通过[] 名称引用任何元素,这样您就可以执行data["query"]["pages"]["6695"]["lastrevid"] 之类的操作。这将通过所有那些名称在 c# 中无效的小对象。

【讨论】:

  • 看起来这是针对不支持动态的 wp7 的 :( 我将把它留给不受 c#3 约束的其他人
  • 不需要使用泛型方法,你可以像dynamic data = JsonConvert.DeserializeObject(json);
【解决方案2】:

这里是你如何使用https://github.com/facebook-csharp-sdk/simple-json (https://nuget.org/packages/SimpleJson)。

var text = "{\"query\":{\"pages\":{\"6695\":{\"pageid\":6695,\"ns\":0,\"title\":\"Citadel\",\"touched\":\"2012-01-03T19:16:16Z\",\"lastrevid\":468683764,\"counter\":\"\",\"length\":8899}}}}";

(使用动态)

dynamic json = SimpleJson.DeserializeObject(text);
string title = json.query.pages["6695"].title;

foreach (KeyValuePair<string, dynamic> page in json.query.pages)
{
    var id = page.Key;
    var pageId = page.Value.pageid;
    var ns = page.Value.ns;
}

(使用强类型类)

class result
{
    public query query { get; set; }
}
class query
{
    public IDictionary<string, page> pages { get; set; }
}
class page
{
    public long pageid { get; set; }
    public string title { get; set; }
}

var result = SimpleJson.DeserializeObject<result>(text);

[更新]

在不支持动态且您不想使用强类型类的 windows phone 上。

var json = (IDictionary<string, object>)SimpleJson.DeserializeObject(text);
var query = (IDictionary<string, object>)json["query"];
var pages = (IDictionary<string, object>)query["pages"];
var pageKeys = pages.Keys;
var page = (IDictionary<string, object>)pages["6695"];
var title = (string)page["title"];

【讨论】:

  • 太棒了!这有效(Json.NET 是相同的,并且可以使用与 SimpleJson 相同的强类型类)。谢谢。
  • 我刚从 GitHub 解析 Gist 文件详细信息时遇到了这个问题。非常感谢您在这里的回答。我没想到要使用 IDictionary!
【解决方案3】:

我希望下面的示例会有所帮助。 我总是设计一个匹配 json 的模型。当它是您自己的模型设计时,使用该对象会更好。

从 json 生成 c# 模型非常容易。我使用这个网站来生成模型:http://json2csharp.com

一个完整的例子是:

C#代码:

    var targetsObject = Newtonsoft.Json.JsonConvert.DeserializeObject<YourModel>(jsonString);

JSON:

    {
      "investors": [
        {
          "name": "06",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": "6.0"
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "07",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": "7.0"
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "08",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": "7.0"
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "09",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "10",
          "programs": [
            {
              "name": "Conventional",
              "value": ""
            },
            {
              "name": "FHA - Standard",
              "value": ""
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": ""
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": "2.0"
            }
          ]
        },
        {
          "name": "11",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "6.0"
            },
            {
              "name": "VA IRRRL",
              "value": "6.0"
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "12",
          "programs": [
            {
              "name": "Conventional",
              "value": "3.5"
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": "5.5"
            },
            {
              "name": "VA IRRRL",
              "value": "6.0"
            },
            {
              "name": "Non-Prime",
              "value": ""
            }
          ]
        },
        {
          "name": "13",
          "programs": [
            {
              "name": "Conventional",
              "value": ""
            },
            {
              "name": "FHA - Standard",
              "value": "5.0"
            },
            {
              "name": "FHA - Streamline",
              "value": ""
            },
            {
              "name": "VA",
              "value": ""
            },
            {
              "name": "VA IRRRL",
              "value": ""
            },
            {
              "name": "Non-Prime",
              "value": "2.0"
            }
          ]
        }
      ]
    }

型号:

    public class Program
    {
        public string name { get; set; }
        public string value { get; set; }
    }

    public class Investor
    {
        public string name { get; set; }
        public List<Program> programs { get; set; }
    }

    public class RootObject
    {
        public List<Investor> investors { get; set; }
    }

【讨论】:

    【解决方案4】:

    使用 Json.net 你可以这样做:

    Dictionary<string,object> result = JsonConvert.DeserializeObject<Dictionary<string,object>>(json);
    foreach(var item in result)
        Console.WriteLine(item.Key + " " + item.Value);
    

    【讨论】:

      【解决方案5】:

      在 JSON 字符串中进行简单的搜索和替换怎么样?虽然它可能不是最优雅的解决方案,但它可能是最实用的解决方案。

      【讨论】:

      • 是的,有人刚刚在 Twitter 上提出了这个想法。试一试,可能会奏效,而且不会太粘。
      【解决方案6】:

      也许您可以只使用一个保留属性来包含对象类型,然后使用本文所示的基本类型:Dynamic types with JSON.NET

      【讨论】:

        猜你喜欢
        • 2015-11-22
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多