【发布时间】: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