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

Bil*_*ser 17 json json.net windows-phone-7 deserialization

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

这是一个示例JSON url:

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"
        } } } }
Run Code Online (Sandbox Code Playgroud)

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

如果我使用像JObject.Parse(内容)这样的东西,然后将项目作为JArrays访问,我似乎可以采取一些值,但它非常难看,我仍然坚持试图从页面数组中获取数据.

正在寻找有人帮助解决这个问题.我不认为这种情况并不常见,它只是我之前遇到过的JSON数据而不确定如何处理它.

谢谢!

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

Bui*_*ted 27

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

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

您可以通过它的[]名称引用任何元素,以便您可以执行类似的操作data["query"]["pages"]["6695"]["lastrevid"].这将由c#中名称无效的所有小对象获取.

  • 看起来这是为wp7不支持动态:(我会留在这里为其他任何不受c#3限制的人 (2认同)

pra*_*bir 18

这里是你如何使用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}}}}";
Run Code Online (Sandbox Code Playgroud)

(使用动态)

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;
}
Run Code Online (Sandbox Code Playgroud)

(使用强类型类)

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);
Run Code Online (Sandbox Code Playgroud)

[更新]

在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"];
Run Code Online (Sandbox Code Playgroud)