【问题标题】:Unusual JSON construct不寻常的 JSON 构造
【发布时间】:2021-04-17 19:40:49
【问题描述】:

我应该阅读以下 JSON 响应:

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

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

【问题讨论】:

  • 一些在线 json 到 c# 转换器可能会有所帮助,例如:link
  • 比较复杂,因为 json 数组中的每个对象都有不同的形状。如果强类型对您来说不重要,您始终可以将其反序列化为 dynamic。否则你需要实现你自己的JsonConverter
  • 另一种方法是将所有 4 个字段作为可为空的类型放在一个类型中。对于第一行和第三行,其中 3 行将是非空的,而对于第二行,这 3 行将是空的,operator 字段将是非空的。您的代码需要相应地观察和处理。

标签: c# json json-deserialization


【解决方案1】:

首先,您的示例中,JSON 不是有效的 JSON。要使其有效,必须为每个属性名称添加引号,例如 field"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 属性是否不为空,未来的代码就知道如何处理数据。

Operator field comparitor value
null amount GREATER 0
AND null null 0
null id LESS 5

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2014-04-15
    • 2011-09-08
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多