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

标签 c# json deserialization system.text.json

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

{ "Parameters": [ 1, "2", true, false, null ] }
使用 System.Text.Json序列化器。目标类如下所示:
public class Payload {
    public object[] Parameters { get; set; }
}
参数始终是原始值,如数字、字符串、 bool 值等。
但看起来像System.Text.Json填充我的 Parameters数组与JsonElement值而不是普通的标量值。这是代码示例:
var payload = new Payload {
    Parameters = new object[] {
        1, "2", true, false, null
    }
};

var json = JsonSerializer.Serialize(payload);
// result: {"Parameters":[1,"2",true,false,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);

关于c# - System.Text.Json 对象数组反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63429334/

相关文章:

c# - 内存中对象的大小

javascript在循环中向json对象添加值

java - 以 json 格式发送时日期格式错误

c# - 如何使用 Newtonsoft.Json 反序列化 JSON 数组

c# - 使用具有变量名称的项目反序列化数组

c# - 在 Workflow Foundation 4 中管理 ObjectContext

c# - 打印从 0 到 10,000 的素数

c# - 如何从当前时间减去 6 小时?

javascript - 如何将 JavaScript 数组发送到 Rest 服务

java - `private void readObject(ObjectInputStream stream)`如何在Java中自定义序列化返回一个对象?