json 用数组或字符串反序列化字段

35g0bw71  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(151)

在我的.NET 5应用程序中,我使用System.Text.Json函数反序列化数据。这在大多数情况下是有效的。除了接收到的JSON文档中的一个字段,该字段可以包含数字数组、字符串数组或单个字符串(不含数组)。
我可以通过将目标类型中的字段定义为List<dynamic>来处理前两种情况。但如果出现第三种情况,即独立字符串,则会引发异常。
我如何做到这第三种情况也能毫无例外地处理呢?我更喜欢在我的列表中得到一个元素。这可能吗?
JSON中有三个可能的值:

{
  "range": [
    0,
    100
  ]
}

{
  "range": [
    "yes",
    "no"
  ]
}

{
  "range": "n/a"
}

字符串

2w2cym1i

2w2cym1i1#

你可以试试这个自定义转换器

var testRange = System.Text.Json.JsonSerializer.Deserialize<TestRange>(json);

public class TestRange
{
    [System.Text.Json.Serialization.JsonConverter(typeof(ToListJsonConverter))]
    public List<object>? range { get; set; }
}

public class ToListJsonConverter : System.Text.Json.Serialization.JsonConverter<List<object>>
{
    public override List<object> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.StartArray)
        {
            var arr = System.Text.Json.JsonSerializer.Deserialize<List<object>>(ref reader, options);
            if (arr is null) return default;
                  else  return  arr;
        }
        else if (reader.TokenType == JsonTokenType.String) return new List<object> { reader.GetString() };
        return default;
    }

    public override void Write(Utf8JsonWriter writer, List<object> value, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }
}

字符串

qlvxas9a

qlvxas9a2#

您需要编写自定义转换器或使用JsonDocument进行动态反序列化:

// .NET 7 feature here - raw string literals:
var jsons = new[]
{
    """
    {
      "range": [
        0,
        100
      ]
    }
    """,
    """
    {
      "range": [
        "yes",
        "no"
      ]
    }
    """,
    """
    {
      "range": "n/a"
    }
    """
};

foreach (var jsonStr in jsons)
{
    using var jd = JsonDocument.Parse(jsonStr);
    var jsonElement = jd.RootElement.GetProperty("range");
    switch (jsonElement.ValueKind)
    {
        case JsonValueKind.Array:
            var array = jsonElement.Deserialize<object[]>();
            Console.WriteLine(array.Length);
            break;
        case JsonValueKind.String:
            Console.WriteLine(jsonElement.GetString());
            break;
    }
}

字符串
sharplab.io

相关问题