获取正确但略有不同的值反序列化字典
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]);
最后一行失败,因为数据类型 JsonElement
和 int
不匹配。
我们可以使用转换器来转换为特定类型。
仅举个例子(详见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);
我是运行下面的代码
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]);
最后一行失败,因为数据类型 JsonElement
和 int
不匹配。
我们可以使用转换器来转换为特定类型。
仅举个例子(详见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);