获取正确但略有不同的值反序列化字典

Getting correct but slightly different value deserializing a dictionary

我是运行下面的代码

Dictionary<string, object> input = new Dictionary<string, object>
{
  {"monkey", "donkey"},
  {"wonkey", 1337}
};
string serial = JsonSerializer.Serialize(input);
var output = JsonSerializer.Deserialize<Dictionary<string, object>>(serial);

序列化后的值为"{\"monkey\":\"donkey\",\"wonkey\":1337}"。然而,检查原件,我看到

{[monkey, donkey]}
{[wonkey, 1337]}

虽然游戏看起来像这样:

{[monkey, ValueKind = String : "donkey"]}
{[wonkey, ValueKind = Number : "1337"]}

而且我不知道如何“纠正”它。当然,单元测试惨遭失败,因为它看到了不同的值。对于人类来说,很明显它是相同的值。或者,更确切地说,是一样的。

我怀疑这与 object 的转换有关,它实际上是一个整数 and/or 字符串。我尝试了下面的示例,它产生了类似的操作但无法重现偏差,因为重新创建与原始完全相同。

object original = "original";
string serialization = JsonSerializer.Serialize(original);
object recreation = JsonSerializer.Deserialize<string>(serialization);

单元测试断言方式如下。最后一个断言失败。

Assert.Equal(input.Count, output.Count);
Assert.NotSame(input, output);
foreach (string key in input.Keys)
  Assert.True(output.ContainsKey(key));
foreach (string key in input.Keys)
  Assert.Equal(input[key], output[key]);

最后一行失败,因为数据类型 JsonElementint 不匹配。 我们可以使用转换器来转换为特定类型。

仅举个例子(详见MSDN)。

public class ObjectConverter: JsonConverter<object>
{
  public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  {
    if (reader.TokenType == JsonTokenType.Number)
      return reader.GetInt32();

    if (reader.TokenType == JsonTokenType.String)
      return reader.GetString();

    return reader.GetString();
  }

  public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
  {
    writer.WriteStringValue(value.ToString());
  }
}

并在反序列化中使用此转换器。

var options = new JsonSerializerOptions();
options.Converters.Add(new ObjectConverter());
var output = JsonSerializer.Deserialize<Dictionary<string, object>>(serial, options);