自定义 JSON.net 反序列化为字典<字符串、字符串>

本文关键字:字符串 字典 JSON net 反序列化 自定义 | 更新日期: 2023-09-27 18:33:52

我希望使用 JSON.net 将JSON结构反序列化为字典。 诀窍是 JSON 文档是嵌套对象的层次结构,但我只想查看顶级属性 + 值对。

例如。

{
    "prop1": 142,
    "prop2": "Some description",
    "object_prop": {
        "abc": 2,
        "def": {
            "foo": "hello",
            "bar": 4
        }
    }
}

基于上面的例子,我想让我的反序列化字典中有 3 个项目:"prop1"、"prop2"和"object_prop"。 "object_prop"应该只是一个字符串(我将在稍后的某个时间点将其反序列化为对象。

注意:我希望这样做,因为我想创建一个可重用的库,它只知道顶级键/值对,以及使用该库的客户端可以在以后的时间点定义值的类型。 (即。我不希望我的可重用库绑定到对象类型...即"object_prop")。

自定义 JSON.net 反序列化为字典<字符串、字符串>

这样的事情怎么样?

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""prop1"": 142,
            ""prop2"": ""Some description"",
            ""object_prop"": {
                ""abc"": 2,
                ""def"": {
                    ""foo"": ""hello"",
                    ""bar"": 4
                }
            },
            ""prop3"": 3.14
        }";
        Dictionary<string, string> dict = new Dictionary<string, string>();
        JObject jo = JObject.Parse(json);
        foreach (JProperty prop in jo.Properties())
        {
            if (prop.Value.Type == JTokenType.Array || 
                prop.Value.Type == JTokenType.Object)
            {
                // JSON string for complex object
                dict.Add(prop.Name, prop.Value.ToString(Formatting.None));  
            }
            else
            {
                // primitive value converted to string
                object value = ((JValue)prop.Value).Value;  
                dict.Add(prop.Name, value != null ? value.ToString() : null);
            }
        }
        foreach (KeyValuePair<string, string> kvp in dict)
        {
            Console.WriteLine(kvp.Key + " = " + kvp.Value);
        }
    }
}

输出:

prop1 = 142
prop2 = Some description
object_prop = {"abc":2,"def":{"foo":"hello","bar":4}}
prop3 = 3.14