System.Text.Json对象数组反序列化

问题描述

我正在尝试反序列化JSON,例如:

{ "Parameters": [ 1,"2",true,false,null ] }

使用System.Text.Json序列化器。目标类如下:

public class Payload {
    public object[] Parameters { get; set; }
}

参数始终是原始值,例如数字,字符串,布尔值等。 但是看起来System.Text.Json填充了我的Parameters数组 JsonElement个值,而不是普通标量值。这是代码示例:

var payload = new Payload {
    Parameters = new object[] {
        1,null
    }
};

var json = JsonSerializer.Serialize(payload);
// result: {"Parameters":[1,null]}

var deserialized = JsonSerializer.Deserialize<Payload>(json);
// result: deserialized.Parameters are all `JsonElement` values

使用Payload类的代码不依赖于System.Text.Json, 它与序列化器无关。有没有办法反序列化对象数组 使用System.Text.Json并返回普通标量值而不是JsonElement

解决方法

指示如何完成。如果我们可以将int64用于数字,但仍然只是POC,将正确地反序列化测试数据。

public class ObjectConverter : JsonConverter<object>
{
  public override object Read(ref Utf8JsonReader reader,Type typeToConvert,JsonSerializerOptions options)
  {
    return reader.TokenType switch
    {
      JsonTokenType.Number => reader.GetInt64(),JsonTokenType.String => reader.GetString(),JsonTokenType.True => reader.GetBoolean(),JsonTokenType.False => reader.GetBoolean(),_ => null
    };
  }

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

 public class Payload {
   public object[] Parameters { get; set; }
 }

 var payload = new Payload
 {
   Parameters = new object[] { 1,"2",true,false,null }
 };

 var json = JsonSerializer.Serialize(payload);
 var serializeOptions = new JsonSerializerOptions();
 serializeOptions.Converters.Add(new ObjectConverter());
 var deserialized = JsonSerializer.Deserialize<Payload>(json,serializeOptions);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...