使用.NET 6反序列化KeyValuePair和Dictionary

4

我在以下最小代码中遇到了问题:

[Fact]
public void DeserializeKeyValuePair()
{
    string text = "{\"offer\": 12432515239}";
    KeyValuePair<string, long> test = JsonSerializer.Deserialize<KeyValuePair<string, long>>(text);
}

在 .NET 7 中,这段代码按预期工作。
相反,在 .NET 6 中会抛出一个错误,指出无法转换 keyvaluepair。
System.Text.Json.JsonException : 
The JSON value could not be converted to System.Collections.Generic.KeyValuePair`2[System.String,System.Int64]. 
Path: $.offer | LineNumber: 0 | BytePositionInLine: 9.

很遗憾,由于与另一个重要库不兼容,我无法将我的项目升级到.NET 7。

也许Newtonsoft.Json可以做到这一点,但我正在尽量保持第三方库的最小化。我也很惊讶在互联网上找不到更多关于这个问题的参考。

有没有办法解决这个问题?

更新:

字符串似乎在.NET 7中反序列化为null,这仍然是意外的。但它不会崩溃。主要目的是从服务器API响应中反序列化字典。

根据Guru Stron的建议,解决方案是安装nuget包。请查看他的答案。


1
你是正确的 https://dotnetfiddle.net/C27QRG - Jodrell
1个回答

3

反序列化到 KeyValuePair<,> 导致异常似乎是一个 bug,但你可以使用 Dictionary<string, long>

KeyValuePair<string, long> test =
    JsonSerializer.Deserialize<Dictionary<string, long>>(text).First();

或创建一个自定义转换器。另一个你可以尝试的方法是手动安装最新版本的System.Text.Json nuget

附言:

在.NET 7中,此代码按预期工作。

或者不是,我会说这里的预期是有争议的(与Dictionary<,>处理相比),虽然在.NET 7中Newtonsoft.JsonSystem.Text.Json的工作方式是一样的:

KeyValuePair<string, long> test = 
    JsonSerializer.Deserialize<KeyValuePair<string, long>>(text);
// test = JsonConvert.DeserializeObject<KeyValuePair<string, long>>(text);
Console.WriteLine(test.Key ?? "null"); // prints "null"
Console.WriteLine(test.Value); // prints "0"

你是正确的,它返回了 null,这仍然是意外的。 不幸的是,对于我来说,字典在 .net 6 上也无法工作,但是:安装 nuget 包可以解决问题! - julian bechtold
@julianbechtold 这很奇怪,因为答案里的链接 Fiddle 显示应该可以。您可以查看分叉。将 JSON 对象反序列化为字典是一种相当常见的约定,据我所知。 - Guru Stron

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