询问收到了JSON结构



我目前正在使用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。

相关内容

  • 没有找到相关文章

最新更新