这是this question的绝对最简单版本(它的子集)。
using System;
using System.Collections.Generic;
using System.Text.Json;
public class Program
{
public class Subscription
{
public bool HasRead { get; set; } = true;
public string TimeStamp { get; set; } = "";
}
public static void Main()
{
// this input format is a requirement. It cannot be changed.
string json = @"
{
""305FDF11-25E7-43DE-B09D-DFFC17C79599"": {
""hasRead"": true, // EDIT: Removed the double quotes around the boolean. That was not the core issue.
""Timestamp"": ""XXX""
}
}
";
// I'm trying to find the correct deserialization type in C#
var deser = JsonSerializer.Deserialize<KeyValuePair<string, Subscription>>(json,
new JsonSerializerOptions(JsonSerializerDefaults.Web));
// System.Text.Json.JsonException:
//'The JSON value could not be converted to
//System.Collections.Generic.KeyValuePair
}
}
我不明白为什么不能反序列化。
注意:我对KeyValuePair
类型很感兴趣,但也许它与字段的大小写或其他明显的东西有关。
其他注意事项:当我将KeyValuePair<string, Subscription>
更改为KeyValuePair<string, object>
以使其更宽松时,它仍然失败。
5条答案
按热度按时间3qpi33ja1#
首先,您的JSON不符合
KeyValuePair<string, Subscription>
的默认序列化,我建议将类型切换为Dictionary<string, Subscription>
。此外,默认JSON反序列化器无法反序列化您的JSON。我建议使用Newtonsoft.Json
像这样,你会得到
Subscription timestamp is XXX
的输出。nfg76nw02#
你有两个问题。
(1)
true
被引号包围。默认情况下,它不会反序列化为布尔值,而是字符串。您可以在Subscription
类中更改HasRead
的类型来解决这个问题。如果您想要一个布尔值属性,那么您可以添加如下内容:您不能直接反序列化为
KeyValuePair
,因为它具有命名的Key
和Value
属性。相反,您可以反序列化为Dictionary
:如果你想得到一个
KeyValuePair
,你可以这样做:var kvp = deser.First()
pbwdgjma3#
我们可以使用类型**Dictionary〈String,Subscription〉**来实现。
我尝试打印所有值。输出为:-
注意:-我们应该尝试在json和类属性中匹配大小写。否则,我们将获得null/default值。我已经将JSON字符串中的Timestamp修改为TimeStamp。
hmae6n7t4#
mftmpeh85#
KeyValuePair〈string,Subscription〉类型的默认序列化如下所示:
要改变这种行为,你需要编写你自己的转换器,从JsonConverter类派生。还要注意,true值应该不带引号。