【发布时间】:2014-01-31 17:49:00
【问题描述】:
我目前正在使用一个 beta API (http://developer.riotgames.com/api/methods),它为所有公开的方法返回 JSON。 到目前为止,我已经能够使用 JSON.NET 反序列化所有这些返回值。然而,今天我使用了他们的一个函数,它返回一个有效但在我看来不正确的 JSON。
您可能想知道,为什么不在测试版论坛上询问呢?我有,但到目前为止我还没有收到答案,总的来说这让我很感兴趣。
JSON 返回的一个 sn-p:
"1001": {
"name": "Boots of Speed",
"plaintext": "Slightly increases Movement Speed",
"group": "BootsNormal",
"description": "<...
}
我对这种结构的问题是 ID 被用作没有标识符的“组”。如果它有,我将能够体面地使用它
"ItemID" : "1001"
但它没有。我不介意手动解析它,但我首先想知道这个 JSON 是否正确(不仅仅是有效)。
您是否同意这不是一种创建包含元素列表的 JSON 块的干净方式,或者我在这里遗漏了什么?到目前为止,我还没有在这个 API 的 beta 论坛上看到任何 cmets,所以我真的很想知道为什么。
编辑“有效”与“正确/可用”: 我知道这是一个有效的 JSON 语句。我质疑这是否适用于 JSON.NET。
我有以下类定义(有两个子类):
public class JSONItem
{
[JsonProperty("tags")]
public string[] Tags { get; set; }
[JsonProperty("plaintext")]
public string Plaintext { get; set; }
[JsonProperty("description")]
public string Description { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("into")]
public string[] Into { get; set; }
[JsonProperty("image")]
public JSONItemImage Image { get; set; }
[JsonProperty("colloq")]
public string Colloq { get; set; }
[JsonProperty("gold")]
public JSONItemGold Gold { get; set; }
}
将上述 JSON 块提供给 JSONConvert.DeserializeObject(json) 时会引发错误,因为 JSONItem 中未提及“1001”。 您如何处理这个问题以便可以使用 JSON.NET?
这样的类不会起作用,因为你没有名字可以赋予属性:
public class JSONItemWrapper
{
[JsonProperty("")]
public string ID { get; set; }
[JsonProperty("")]
public JSONItem MyProperty { get; set; }
}
编辑:“与其他方法一致” 其他方法返回每个属性都在 {} 内并具有标识符的块。最近添加的函数具有这种“{} 之外的主键”样式。
【问题讨论】:
-
"1001"是对象中条目的键,假设它包含在{ ... }中 -
剩下的就是一个子对象,就是这个条目的值。
-
这给了我一个语法错误:
JSON.parse('"ItemID" : "1001"'); -
这是有效的 JSON。我是否同意并不是真正的问题。更大的问题是这是否与他们的其他 API 结果一致......
-
对我来说完全有效,key是“1001”,value是另一个json对象