Kyl*_*nes 4 c# standards json json.net
我正在使用提供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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我能够使用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; }
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法我可以使用Newtonsoft.Json反序列化,但如果稍后添加"package4",那么它需要我进行代码更改.
我是否应该推迟使用此API的开发人员并坚持使用一系列软件包,而不是当前如何实现它?
您可以使用a来执行此操作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; }
}
Run Code Online (Sandbox Code Playgroud)
并且像这样反序列化:
var result = JsonConvert.DeserializeObject<Rootobject>(json);
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
foreach (var element in result.Packages)
{
Console.WriteLine($"Package: {element.Key} has name {element.Value.Name}");
}
Run Code Online (Sandbox Code Playgroud)
哪个会输出:
Package: $package1 has name Foo
Package: $package2 has name Bar
Package: $package3 has name Another
Run Code Online (Sandbox Code Playgroud)