我目前正在使用beta api(http://developer.riotgames.com/api/methods),该API返回所有暴露方法的JSON。到目前为止,我已经能够使用JSON.NET对所有这些返回值进行估算。但是,今天我消耗了他们的功能之一,它返回了有效但我认为不正确的JSON。
您可能想知道,为什么不在Beta论坛上询问?我有,但到目前为止我还没有收到答案,总的来说,这让我着迷。
JSON返回的片段:
"1001": {
"name": "Boots of Speed",
"plaintext": "Slightly increases Movement Speed",
"group": "BootsNormal",
"description": "<...
}
我对此结构遇到的问题是,ID被用作没有标识符的"组"。如果它具有
,我将能够很好地使用它"ItemID" : "1001"
但没有。我不介意手动解析它,但我首先想知道这个json是否正确(不仅有效)。
您是否同意这不是创建包含元素列表的JSON块的简洁方法,还是我在这里错过了一些东西?到目前为止,我还没有在此API的Beta论坛上看到任何评论,所以我真的想知道为什么。
编辑"有效" vs"正确/可用":我知道这是一个有效的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; }
}
编辑:"与其他方法一致"其他方法返回每个属性都在{}内并具有标识符的块。最近添加的功能具有此" {}} extiral of {}"样式的"主键"。
它是一个有效的JSON,您可以使用Dictionary<string, SomeObject>
之类的类型来对您的JSON进行估算。
string json = @"{
""1001"": {
""name"": ""Boots of Speed"",
""plaintext"": ""Slightly increases Movement Speed"",
""group"": ""BootsNormal"",
""description"": ""desc...""
}
}";
var dict = JsonConvert.DeserializeObject<Dictionary<string, MyObject>>(json);
稍后通过其密钥加速一个物品也可以很快。
public class MyObject
{
public string name { get; set; }
public string plaintext { get; set; }
public string group { get; set; }
public string description { get; set; }
}
当API执行此类操作(使用数字作为属性名称)时,这很烦人,但一切都不会丢失。只需使用JSON.NET对JSON进行验证,然后使用父对象上的索引运算符访问每个项目。
编辑:
我几乎从不创建DTOS,当时JSON进行了DTO。在大多数情况下,这是很多不必要的样板。我更喜欢挑选 dynamic
对象,但是在处理以数字开头的属性名称时,这不会有效。
这是我将您的示例邮件估计的方式:
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace JsonExample
{
internal class Program
{
private static void Main()
{
const string json = @"
{
'1001': {
'name': 'Boots of Speed',
'plaintext': 'Slightly increases Movement Speed',
'group': 'BootsNormal',
'description': '<...'
}
}";
var jObject = JsonConvert.DeserializeObject<JObject>(json);
var plaintext = jObject["1001"]["plaintext"].Value<string>();
Console.WriteLine(plaintext);
}
}
}
当放入http://jsonlint.com时,
{
"1001": {
"name": "Boots of Speed",
"plaintext": "Slightly increases Movement Speed",
"group": "BootsNormal",
"description": "<..."
}
}
验证为JSON。