使用JSon.NET对动态数据反序列化JSON

使用JSon.NET对动态数据反序列化JSON

问题描述:

我正在尝试将一些JSON数据反序列化为应用程序的对象.到现在为止还不错,因为JSON数据上的属性是静态的(带有值的键).现在,我得到了一个结果,其中的关键是动态数据.

I'm trying to deserialize some JSON data into objects for an application. Up until now it's been fine because the properties on the JSON data was static (key with a value). Now I've got a result where the key is a dynamic piece of data.

这是一个示例JSON网址:

Here's an example JSON url:

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

由此产生的JSON是:

The resulting JSON for this is:

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

好的,那很好,除了我不能将页面"数据反序列化为对象.如果要为页面定义一个类,它必须看起来像这样:

Okay, that's great except I can't deserialize the "pages" data into an object. If I were to define a class for the pages it would have to look like this:

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类.

In order to deserialze the contents (using JsonConvert.Deserialize(jsondata)) and we all know we can't have a class called 6695. Not only that, the name of the class would have to be different (for example pageid=7145 would have to be the 7145 class).

如果我使用诸如JObject.Parse(content)之类的东西,然后以JArrays的形式访问项目,我似乎可能会遗漏一些值,但这非常丑陋,我仍然坚持尝试从pages数组中获取数据.

I can seem to pluck some values out if I use something like JObject.Parse(content) and then access items as JArrays but it's pretty ugly and I'm still stuck on trying to get out the data from the pages array.

正在寻找帮助的人.我认为这并不罕见,这不是我以前遇到的JSON数据,也不知道如何处理它.

Looking for someone to help with this. I don't think it's uncommon, it's just not JSON data I've come across before and not sure how to handle it.

谢谢!

PS忘了提到这是在Windows Phone 7上,因此动态"不可用!

PS forgot to mention this is on Windows Phone 7 so "dynamic" isn't available!

这是您使用 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上.

on windows phone where dynamic is not supported and you don't want to use strongly typed classes.

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"];