【问题标题】:Custom JSON.net deserialization into a Dictionary<string, string>自定义 JSON.net 反序列化为 Dictionary<string, string>
【发布时间】:2013-10-04 15:41:04
【问题描述】:

我希望使用 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”)。

【问题讨论】:

    标签: c# .net json json.net deserialization


    【解决方案1】:

    这样的事情怎么样?

    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
    

    【讨论】:

    • 完美!我正朝着一个自定义的 JsonConverter 前进,它似乎过于复杂。谢谢! :)
    • 没问题;很乐意提供帮助。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多