【问题标题】:Map root JSON array to a property of type. .NET将根 JSON 数组映射到类型的属性。 。网
【发布时间】:2018-07-12 23:13:33
【问题描述】:

我有一个包含两个对象的 JSON 数组。例如:[{},{}]

我想将根数组映射到一个属性:

[JsonArray("Results")]
internal class CollectionResponse : BaseResponse
{
    public ItemsResponse[] Results { get; set; }
}

不幸的是,当它是接收 BaseResponse 类型的自定义程序集时,我无法将集合传递给序列化程序。

可能有一个属性可以将根数组映射到子属性?

【问题讨论】:

  • 你试过什么?以 Newtonsoft JSON 为例,这应该非常简单。
  • 是的,我使用 Newtonsoft JSON。但我找不到任何允许这样做的属性!我试过 JsonArray 但没有任何成功...

标签: c# arrays .net json serialization


【解决方案1】:

使用 Newtonsoft.Json 库非常简单,因为您的 ItemsResponse 数组的属性名称与 Json 模型相同,您甚至不需要使用属性,因为模型绑定足够聪明,可以使用变量名称.

    private static void StackOverflow()
    {
        var jsonString = "{\"Results\":[{\"Item\":\"ItemName1\"},{\"Item\":\"ItemName2\"}]}";

        var collectionResponse = JsonConvert.DeserializeObject<CollectionResponse>(jsonString);
    }

    internal class CollectionResponse
    {
        public ItemsResponse[] Results { get; set; }
    }

    internal class ItemsResponse
    {
        public string Item { get; set; }
    }

编辑:

如果你希望将json中的数组作为root,那么上面的方法仍然是合理的,但是你需要使用反序列化类型作为ItemResponse[]。

    private static void StackOverflow()
    {
        var jsonString = "[{\"Item\":\"ItemName1\"},{\"Item\":\"ItemName2\"}]";

        var collectionResponse = new CollectionResponse()
        {
           Results =  JsonConvert.DeserializeObject<ItemsResponse[]>(jsonString)
        };
    }

    [JsonArray]
    internal class CollectionResponse
    {
        public ItemsResponse[] Results { get; set; }
    }

    internal class ItemsResponse
    {
        public string Item { get; set; }
    }

【讨论】:

  • 不是一个真正的答案。虽然我有无法更改的根 json 数组。示例:[{},{}]
  • 没问题,我已经编辑了适合您情况的答案。
  • @Evgeny [{},{}] 不是 json!它应该有一个名称/键
  • @DanielB 我最初也是这么想的,但显然是根据 RFC 4627 验证 [{},{}] - 这是一个有效的 json。 [链接]jsonformatter.curiousconcept.com
  • @Evgeny 您是否可以选择修改要反序列化的 json?添加 { "Results" : + jsonString + } 可能是使默认反序列化工作的合适选项
猜你喜欢
  • 2020-02-10
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2022-01-18
  • 2019-07-05
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多