Deserializing JSON using JSon.NET with dynamic data

前端 未结 6 1477
被撕碎了的回忆
被撕碎了的回忆 2020-11-28 11:18

I\'m trying to deserialize some JSON data into objects for an application. Up until now it\'s been fine because the properties on the JSON data was static (key with a value)

相关标签:
6条回答
  • 2020-11-28 11:47

    I hope the below example will help. I always design a model that match the json. It is much better to work with the object when it is your own model design.

    It is very easy to generate the c# model from the json. I use this website to generate the model: http://json2csharp.com

    A complete example is:

    C# Code:

        var targetsObject = Newtonsoft.Json.JsonConvert.DeserializeObject<YourModel>(jsonString);
    

    JSON:

        {
          "investors": [
            {
              "name": "06",
              "programs": [
                {
                  "name": "Conventional",
                  "value": "3.5"
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": ""
                },
                {
                  "name": "VA",
                  "value": "5.5"
                },
                {
                  "name": "VA IRRRL",
                  "value": "6.0"
                },
                {
                  "name": "Non-Prime",
                  "value": ""
                }
              ]
            },
            {
              "name": "07",
              "programs": [
                {
                  "name": "Conventional",
                  "value": "3.5"
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": "7.0"
                },
                {
                  "name": "VA",
                  "value": "5.5"
                },
                {
                  "name": "VA IRRRL",
                  "value": ""
                },
                {
                  "name": "Non-Prime",
                  "value": ""
                }
              ]
            },
            {
              "name": "08",
              "programs": [
                {
                  "name": "Conventional",
                  "value": "3.5"
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": "7.0"
                },
                {
                  "name": "VA",
                  "value": "5.5"
                },
                {
                  "name": "VA IRRRL",
                  "value": ""
                },
                {
                  "name": "Non-Prime",
                  "value": ""
                }
              ]
            },
            {
              "name": "09",
              "programs": [
                {
                  "name": "Conventional",
                  "value": "3.5"
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": ""
                },
                {
                  "name": "VA",
                  "value": "5.5"
                },
                {
                  "name": "VA IRRRL",
                  "value": ""
                },
                {
                  "name": "Non-Prime",
                  "value": ""
                }
              ]
            },
            {
              "name": "10",
              "programs": [
                {
                  "name": "Conventional",
                  "value": ""
                },
                {
                  "name": "FHA - Standard",
                  "value": ""
                },
                {
                  "name": "FHA - Streamline",
                  "value": ""
                },
                {
                  "name": "VA",
                  "value": ""
                },
                {
                  "name": "VA IRRRL",
                  "value": ""
                },
                {
                  "name": "Non-Prime",
                  "value": "2.0"
                }
              ]
            },
            {
              "name": "11",
              "programs": [
                {
                  "name": "Conventional",
                  "value": "3.5"
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": ""
                },
                {
                  "name": "VA",
                  "value": "6.0"
                },
                {
                  "name": "VA IRRRL",
                  "value": "6.0"
                },
                {
                  "name": "Non-Prime",
                  "value": ""
                }
              ]
            },
            {
              "name": "12",
              "programs": [
                {
                  "name": "Conventional",
                  "value": "3.5"
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": ""
                },
                {
                  "name": "VA",
                  "value": "5.5"
                },
                {
                  "name": "VA IRRRL",
                  "value": "6.0"
                },
                {
                  "name": "Non-Prime",
                  "value": ""
                }
              ]
            },
            {
              "name": "13",
              "programs": [
                {
                  "name": "Conventional",
                  "value": ""
                },
                {
                  "name": "FHA - Standard",
                  "value": "5.0"
                },
                {
                  "name": "FHA - Streamline",
                  "value": ""
                },
                {
                  "name": "VA",
                  "value": ""
                },
                {
                  "name": "VA IRRRL",
                  "value": ""
                },
                {
                  "name": "Non-Prime",
                  "value": "2.0"
                }
              ]
            }
          ]
        }
    

    Model:

        public class Program
        {
            public string name { get; set; }
            public string value { get; set; }
        }
    
        public class Investor
        {
            public string name { get; set; }
            public List<Program> programs { get; set; }
        }
    
        public class RootObject
        {
            public List<Investor> investors { get; set; }
        }
    
    0 讨论(0)
  • 2020-11-28 11:49

    The simplest method. In this particular case would probably be to go dynamic.

    dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
    var lastRevId = data.query.pages["6695"].lastrevid;
    

    You can reference any element by it's [] name so you can do something like data["query"]["pages"]["6695"]["lastrevid"]. This will get by all those little objects where the name isn't valid in c#.

    0 讨论(0)
  • 2020-11-28 11:51

    Here is how you do using https://github.com/facebook-csharp-sdk/simple-json ( https://nuget.org/packages/SimpleJson ).

    var text = "{\"query\":{\"pages\":{\"6695\":{\"pageid\":6695,\"ns\":0,\"title\":\"Citadel\",\"touched\":\"2012-01-03T19:16:16Z\",\"lastrevid\":468683764,\"counter\":\"\",\"length\":8899}}}}";
    

    (Using dynamic)

    dynamic json = SimpleJson.DeserializeObject(text);
    string title = json.query.pages["6695"].title;
    
    foreach (KeyValuePair<string, dynamic> page in json.query.pages)
    {
        var id = page.Key;
        var pageId = page.Value.pageid;
        var ns = page.Value.ns;
    }
    

    (Using strongly typed classes)

    class result
    {
        public query query { get; set; }
    }
    class query
    {
        public IDictionary<string, page> pages { get; set; }
    }
    class page
    {
        public long pageid { get; set; }
        public string title { get; set; }
    }
    
    var result = SimpleJson.DeserializeObject<result>(text);
    

    [Update]

    on windows phone where dynamic is not supported and you don't want to use strongly typed classes.

    var json = (IDictionary<string, object>)SimpleJson.DeserializeObject(text);
    var query = (IDictionary<string, object>)json["query"];
    var pages = (IDictionary<string, object>)query["pages"];
    var pageKeys = pages.Keys;
    var page = (IDictionary<string, object>)pages["6695"];
    var title = (string)page["title"];
    
    0 讨论(0)
  • 2020-11-28 11:54

    How about a simple search and replace in the JSON string ? While it might not be the most elegant solution, it would possibly be the most pragmatic one.

    0 讨论(0)
  • 2020-11-28 11:55

    Maybe you could just use one reserved attribute to contain the object type, and then use the base type as shown in this article: Dynamic types with JSON.NET

    0 讨论(0)
  • 2020-11-28 11:58

    Using Json.net you can just do:

    Dictionary<string,object> result = JsonConvert.DeserializeObject<Dictionary<string,object>>(json);
    foreach(var item in result)
        Console.WriteLine(item.Key + " " + item.Value);
    
    0 讨论(0)
提交回复
热议问题