首页 > 解决方案 > 使用 System.Text.Json 反序列化不可变记录数组

问题描述

假设我们有这些记录:

public record ResponseFake
{
    [JsonConstructor]
    public ResponseFake(OhlcFake[] quotes)
    {
        Quotes = quotes;
    }
   public OhlcFake[] Quotes { get; }
}
public record OhlcFake
{
    [JsonConstructor]
    public OhlcFake(QuoteFake o)
    {
        O = o;
    }
    public QuoteFake O { get; }
}
public record QuoteFake
{
    [JsonConstructor]
    public QuoteFake(decimal bid)
    {
        Bid = bid;
    }
    public decimal Bid { get; }
}

而这个 XUnit 测试:

[Fact]
public void QuoteChartResponseFakeDeserializationTest()
{
    var data = @"{""quotes"": [ { ""o"": { ""bid"": 1.1 } } ] }";

    var result = System.Text.Json.JsonSerializer.Deserialize<ResponseFake>(data);

    result.Quotes.Should().NotBeEmpty();
}

测试失败并出现错误“预期结果。引号不为空,但已找到。”

我应该怎么做才能获得Quotes人口?

标签: c#system.text.json

解决方案


解决方案是添加JsonSerializerOptions.PropertyNamingPolicy

var options = new JsonSerializerOptions()
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
var result = System.Text.Json.JsonSerializer.Deserialize<ResponseFake>(data, options);

推荐阅读