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

时间:2017-07-21 13:04:28

标签: c# json json.net

使用JSON.Net我想反序列化一个类似于这样的JSON对象:

"properties": {
    "foo": 1,
    "bar": "Fred",
    "baz": [694481.61, 693638.0, 692624.65, 692354.54]
}

并以dictionary<string,string>结尾,如下所示:

{ "foo", "1" },
{ "bar", "\"Fred\"" },
{ "baz", "[694481.61, 693638.0, 692624.65, 692354.54]" }

需要注意的要点是:

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

    1. 将值解析为JRaw个对象。如果我事先知道关键名称,这将有效:我可以在类中声明匹配属性JRaw - 例如public JRaw foo { get; set; }。但是关键名称没有预定义,所以我不能。
    2. 创建一个RawValueDictionaryConverter : JsonConverter自定义转换器,用于获取流并将其直接反序列化为dictionary<string,string>。我认为这很简单,但原始流的原始文本在ReadJson()内不可用;流已经被标记化,ReadJson()仅接收解释的标记和令牌类型。
    3. 编写我自己的tokenizer并忘记使用Json.NET。它可能会出现但我不想重新发明轮子。&#39;

1 个答案:

答案 0 :(得分:1)

你可以反序列化为Dictionary<string, JRaw>,它可以让你到达中途。例如:

//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();
}

如果您仍希望将值作为字符串,则可以像这样转换:

var stringDictionary = result.Properties.ToDictionary(p => p.Key, p => p.ToString());