C# 反序列化任意JSON键和原始值

C# 反序列化任意JSON键和原始值,c#,json,json.net,C#,Json,Json.net,使用JSON.Net,我想反序列化一个JSON对象,如下所示: "properties": { "foo": 1, "bar": "Fred", "baz": [694481.61, 693638.0, 692624.65, 692354.54] } { "foo", "1" }, { "bar", "\"Fred\"" }, { "baz", "[694481.61, 693638.0, 692624.65, 692354.54]" } var stringDict

使用JSON.Net,我想反序列化一个JSON对象,如下所示:

"properties": {
    "foo": 1,
    "bar": "Fred",
    "baz": [694481.61, 693638.0, 692624.65, 692354.54]
}
{ "foo", "1" },
{ "bar", "\"Fred\"" },
{ "baz", "[694481.61, 693638.0, 692624.65, 692354.54]" }
var stringDictionary = result.Properties.ToDictionary(p => p.Key, p => p.ToString());
最终得到的词典如下所示:

"properties": {
    "foo": 1,
    "bar": "Fred",
    "baz": [694481.61, 693638.0, 692624.65, 692354.54]
}
{ "foo", "1" },
{ "bar", "\"Fred\"" },
{ "baz", "[694481.61, 693638.0, 692624.65, 692354.54]" }
var stringDictionary = result.Properties.ToDictionary(p => p.Key, p => p.ToString());
需要注意的要点是:

钥匙事先不知道。因此,使用字典而不是反序列化到具有预定义属性foo、bar和baz的类。 字典中的值字符串是JSON流中的原始JSON文本。所以字符串包含它们的封装引号,数组包含它们的封装方括号。 到目前为止我都试过了

将值解析为JRaw对象。如果我事先知道密钥名称,这将起作用:我可以在类中将匹配的属性声明为JRaw类型,例如publicjraw foo{get;set;}。但是键名不是预定义的,所以我不能。 创建一个RawValueDictionaryConverter:JsonConverter自定义转换器,用于获取流并将其直接反序列化到字典。我认为这很简单,但是原始流的原始文本在ReadJson中不可用;流已经标记化,ReadJson只接收解释的标记和标记类型。 编写我自己的标记器,忘记使用Json.NET。可能会这样,但我不想“重新发明轮子” 你可以反序列化到字典,这会让你走到一半。例如:

//Example class
public class Root
{
    public Dictionary<string, JRaw> properties { get; set; }
}

var json = "<from the question>";
var result = JsonConvert.DeserializeObject<Root>(json);

foreach (var property in result.Properties)
{
    var value = property.Value.ToString();
}

反序列化到Dictionary而不是Dictionary所以要将它们作为字符串?问题还不清楚。您声明值是JSON,而不是要将其解码为字符串。好的,我已将“值”澄清为“字典中的值字符串”。抱歉搞混了。是的,就是这样。我不知道为什么那个解决办法让我逃避了这么久。很遗憾,我需要把这本字典复制到一本字典上,但没关系。谢谢。你可以编写一个自定义转换器来避免这一步,其实并不太难,但如果这个解决方案可行,那又何必麻烦呢:这是我最初的方法,但我不知道如何说服ReadJson接收JRaw类型而不是JValue解释的令牌。