使用.NET 6反序列化键值对和字典

nqwrtyyt  于 2023-02-06  发布在  .NET
关注(0)|答案(1)|浏览(147)

我有一个问题与以下最小代码:

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

在. NET 7中,此代码按预期工作。
. NET 6则会引发无法转换键值对的错误。

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响应反序列化字典。
解决办法是,根据大师斯特龙安装nuget包。看看他的答案。

ncgqoxb0

ncgqoxb01#

反序列化到KeyValuePair<,>导致异常看起来像是一个bug,但是您can use Dictionary<string, long>

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

或者创建一个custom converter.另一种方法是手动安装最新版本的System.Text.Json nuget。
附言
在. NET 7中,此代码按预期工作。
不管是不是,我想说这里的期望值有待讨论(与Dictionary<,>处理相比),尽管Newtonsoft.JsonSystem.Text.Json在. NET 7中的工作原理是一样的:

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"

相关问题