.net 在C#中使用动态项反序列化json对象

vngu2lb8  于 2022-12-24  发布在  .NET
关注(0)|答案(1)|浏览(164)

我有下面的json文档:

{
  "name": "bert",
  "Bikes": {
    "Bike1": {
      "value": 1000,
      "type": "Trek"
    },
    "Bike2": {
      "value": 2000,
      "type": "Canyon"
    }
  }
}

我想反序列化为C#对象。问题是在反序列化步骤中bikes数据完全丢失,导致空Bikes集合。
复制代码:

[Test]
public void FirstCityJsonParsingTest()
{
    var file = @"./testdata/test.json";
    var json = File.ReadAllText(file);

    var res = JsonConvert.DeserializeObject<Person>(json);
    Assert.IsTrue(res.Name == "bert");
    // next line is failing, because res.Bikes is null...
    Assert.IsTrue(res.Bikes.Count == 2);
}

public class Bike
{
    public string Id { get; set; }
    public int Value { get; set; }
    public string Type { get; set; }
}

public class Person
{
    public string Name { get; set; }
    public List<Bike> Bikes { get; set; }
}

要解决这个问题,必须更改所用的模型。但是要正确填写自行车数据,需要做什么更改呢?
注意:更改输入文档不是一个选项(因为它是一个规范)

r1wp621o

r1wp621o1#

您的代码结构未反映您的json。使用动态属性名称反序列化json的常用方法是使用Dictionary<string, ...>Json.NETSystem.Text.Json都支持)。请尝试以下操作:

public class Bike
{
    public int Value { get; set; }
    public string Type { get; set; }
}

public class Person
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Dictionary<string, Bike> Bikes { get; set; }
}

Person.Bikes应更改为Dictionary<string, Bike>(也不需要Bike.Id属性),因为Bikes json元素不是数组而是对象。

相关问题