c# - 反序列化没有唯一属性名称的 JSON

标签 c# json json.net json-deserialization

我有一个如下所示的 json 字符串

{
    "1ST": {
        "name": "One",
        "symbol": "1st"
    },
    "2ND": {
        "name": "Two",
        "symbol": "2nd"
    }
}

我正在尝试将其序列化为 C# 对象。看起来它正在创建一个字典,所以我创建了以下结构

public class Response
{
    public Dictionary<string, Item> Objects { get; set; }
}

public class Item
{
    public string name { get; set; }
    public string symbol { get; set; }
}

并且在序列化期间运行以下

response = JsonConvert.DeserializeObject<Response>(jsonString);

它不会在反序列化时抛出错误,但我的响应只是返回为 null。我错过了什么?

最佳答案

你的基本想法是正确的,但你还有一个额外的 Objects您并不真正想要的属性:您的 JSON 实际上是字典。您可以将其直接反序列化为 Dictionary<string, Item>> .这是一个例子:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

public class Item
{
    public string Name { get; set; }
    public string Symbol { get; set; }

    public override string ToString() => $"{Name}/{Symbol}";
}

public class Test
{
    static void Main()
    {
        var json = File.ReadAllText("test.json");
        var dictionary = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
        foreach (var entry in dictionary)
        {
            Console.WriteLine($"{entry.Key}: {entry.Value}");
        }
    }
}

输出:

1ST: One/1st
2ND: Two/2nd

现在,如果您需要您的 Response类型,有多种选择:

  • Dictionary<string, Item>派生并删除 Objects属性(property)。 (如果您需要 Objects 属性则不好。)
  • 反序列化到字典,然后创建一个新的 Response反对并自己分配属性(property)。 (如果响应是另一种类型的一部分则不好。)
  • 调查 Json.NET 是否有一些属性来处理 Objects作为一种“根”属性。

我在最后一个方面有一些运气,但不是一个完整的解决方案。如果你改变 ObjectsDictionary<string, JToken>那么你可以申请[JsonExtensionData]对它来说,这使得它充当任何不匹配属性的默认字典。但是,我还没有找到一种方法来说服 Json.NET 使用该属性 执行适当的转换。您可以创建一个字典,执行从 JToken 的转换。至 Item (使用常规的 Json.NET 代码)每次向其中添加一个条目,然后将该值添加到另一个字典中——但这非常难看。这可能只是 Json.NET 无法处理的情况。

关于c# - 反序列化没有唯一属性名称的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49932943/

相关文章:

c# - 网络 API : Configure JSON serializer settings on action or controller level

c# - 修改private readonly成员变量?

c# - FluentValidation 能否识别调用了哪些方法(PUT 或 POST)?

c# - 如何在进入 Controller 之前调试 .net 中的挂起请求

java - Jackson - 将 java 对象转换为 json - 需要所有键为大写

json - swift - JSON 字典解析

c# - WPF 用户控件库中的打包字符串

javascript - 通过映射到子 html 元素呈现响应数据...使用 React 和更新状态

json.net - 没有带有设置和转换器参数的 Json.net 构造函数

c# - 为什么 HttpResponseMessage 不显示其内容?