首页 > 解决方案 > 不寻常的 JSON 构造

问题描述

我应该阅读以下 JSON 响应:

ValueFilters:[
{field:"amount", comparitor:"GREATER", "value": 0},
{operator:"AND"},
{field:"id", comparitor:"LESS", "value": 5}]

如果它不包含 'operator' 对象,那么我不会有任何问题,但我如何构造等效的 C# 对象?

标签: c#jsonjson-deserialization

解决方案


首先,您的示例,JSON 不是有效的 JSON。为了使其有效,必须为每个属性名称添加引号,例如fieldto "field"。完成后,可以解析 Json:

{
  "ValueFilters": [
    {
      "field": "amount",
      "comparitor": "GREATER",
      "value": 0
    },
    {
      "operator": "AND"
    },
    {
      "field": "id",
      "comparitor": "LESS",
      "value": 5
    }
  ]
}

通过采用上面的有效 Json,它可以序列化为这些 C# 类:

public class Filters
{
    public List<ValueFilter> ValueFilters { get; set; }   
}

public class ValueFilter
{
    [JsonPropertyName("operator")]        // Handle the C# `operator` keyword.
    public string Operator { get; set; }
    
    public string field { get; set; }

    public string comparitor { get; set; } // Misspell -> comparator

    public int value { get; set; }

} 

使用您最喜欢的解串器看起来像这样,.Net 5 System.Text.Json 显示

var filter = JsonSerializer.Deserialize<Filters>(data);

当反序列化时,您有 3 个ValueFilter项目。通过检查Operator属性是否不为空,未来的代码知道如何处理数据。

操作员 场地 比较器 价值
空值 数量 更大 0
空值 空值 0
空值 ID 较少的 5

推荐阅读