c# - 将数据作为键名包含在 JSON 中是否正确?

标签 c# json json.net standards

我正在使用提供 JSON 负载的 API。 JSON 中的一个属性实际上是一个数据元素,因此我无法在不添加额外类的情况下反序列化负载。

这是 JSON:

{
      "company": "ABC Inc.",
      "packages": {
          "$package1": {
          "code": "$package1",
          "name": "Foo",
          "price": 1000
        },
        "$package2": {
          "code": "$package2",
          "name": "Bar",
          "price": 2000
        },
        "$package3": {
          "code": "$package3",
          "name": "Another",
          "price": 3000
        }
    }
}

我可以使用带有以下类的 Newtonsoft.Json 进行序列化:

public class Rootobject
{
    public string company { get; set; }
    public Packages packages { get; set; }
}

public class Packages
{
    public Package1 package1 { get; set; }
    public Package2 package2 { get; set; }
    public Package3 package3 { get; set; }
}

public class Package1
{
    public string code { get; set; }
    public string name { get; set; }
    public int price { get; set; }
}

public class Package2
{
    public string code { get; set; }
    public string name { get; set; }
    public int price { get; set; }
}

public class Package3
{
    public string code { get; set; }
    public string name { get; set; }
    public int price { get; set; }
} 

使用这种方法,我可以使用 Newtonsoft.Json 反序列化,但如果稍后添加“package4”,则需要我进行代码更改。

我是否应该反驳此 API 的开发人员并坚持使用一系列程序包,而不是它当前的实现方式?

最佳答案

您可以使用 Dictionary<> 来做到这一点,例如:

public partial class Rootobject
{
    public string Company { get; set; }
    public Dictionary<string, Package> Packages { get; set; }
}

public partial class Package
{
    public string Code { get; set; }
    public string Name { get; set; }
    public long Price { get; set; }
}

像这样反序列化:

var result = JsonConvert.DeserializeObject<Rootobject>(json);

然后像这样使用它:

foreach (var element in result.Packages)
{
    Console.WriteLine($"Package: {element.Key} has name {element.Value.Name}");
}

哪个会输出:

Package: $package1 has name Foo
Package: $package2 has name Bar
Package: $package3 has name Another

关于c# - 将数据作为键名包含在 JSON 中是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54337307/

相关文章:

c# - ASP.Net MVC 纯 View 模型

c# - 使用带有加密连接字符串的 Application.LoadFromSqlServer() 加载 SSIS 包

javascript - 在 JQuery 中解析 JSON 数组

c# - 使用不可变嵌套对象反序列化 Json.NET

c# - JSON 序列化程序在自定义 JsonConverter 中序列化自定义数据类型时添加额外字符作为响应 '\'

c# - 当数组具有静态名称时,如何循环遍历此 JSON?

c# - 服务器端 JSON 压缩 .net Core

arrays - 如何将非标准索引的数组转换为json?

json - 在 Angular 2 中从 JSON 对象获取嵌套数据

c# - 将异步方法作为 Quartz.NET 作业运行并处理对象问题