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

7

我正在尝试反序列化这样的JSON:

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

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

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

参数始终是原始值,如数字、字符串、布尔值等。

但是似乎System.Text.Json使用JsonElement值而不是纯量值填充我的Parameters数组。以下是代码示例:

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

使用System.Text.Json反序列化对象数组时,消费Payload类的代码不依赖于它,这是与序列化器无关的。有没有一种方法可以使用System.Text.Json反序列化对象数组并返回纯量值而不是JsonElement

2
这种行为在将推断类型反序列化为对象属性文章中有详细解释。你尝试过遵循它并编写自己的JsonConverter<object>吗? - Pavel Anikhouski
谢谢Pavel,看起来我在文档中错过了这篇文章。 - yallie
1个回答

5
一种实现方式。如果我们可以使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接