简体   繁体   中英

How to pull a specific value from dynamic JSON dictionary in C#

I'm trying to pull one specific piece of data from the json received from a geocoding request. This is not a duplicate of the myriads of similar-sounding questions, because the json is dynamic and has extremely irregular arrays that change slightly between responses, so I can't create a model to parse to, neither can I navigate through it using key names.
This is the json of one response:

{  
   "Response":{  
      "MetaInfo":{  
         "Timestamp":"2019-07-28T13:23:04.898+0000"
      },
      "View":[  
         {  
            "_type":"SearchResultsViewType",
            "ViewId":0,
            "Result":[  
               {  
                  "Relevance":1.0,
                  "MatchLevel":"houseNumber",
                  "MatchQuality":{  
                     "City":1.0,
                     "Street":[  
                        0.9
                     ],
                     "HouseNumber":1.0
                  },
                  "MatchType":"pointAddress",
                  "Location":{  
                     "LocationId":"NT_Opil2LPZVRLZjlWNLJQuWB_0ITN",
                     "LocationType":"point",
                     "DisplayPosition":{  
                        "Latitude":41.88432,
                        "Longitude":-87.63877
                     },
                     "NavigationPosition":[  
                        {  
                           "Latitude":41.88449,
                           "Longitude":-87.63877
                        }
                     ],
                     "MapView":{  
                        "TopLeft":{  
                           "Latitude":41.8854442,
                           "Longitude":-87.64028
                        },
                        "BottomRight":{  
                           "Latitude":41.8831958,
                           "Longitude":-87.63726
                        }
                     },
                     "Address":{  
                        "Label":"425 W Randolph St, Chicago, IL 60606, United States",
                        "Country":"USA",
                        "State":"IL",
                        "County":"Cook",
                        "City":"Chicago",
                        "District":"West Loop",
                        "Street":"W Randolph St",
                        "HouseNumber":"425",
                        "PostalCode":"60606",
                        "AdditionalData":[  
                           {  
                              "value":"United States",
                              "key":"CountryName"
                           },
                           {  
                              "value":"Illinois",
                              "key":"StateName"
                           },
                           {  
                              "value":"Cook",
                              "key":"CountyName"
                           },
                           {  
                              "value":"N",
                              "key":"PostalCodeType"
                           }
                        ]
                     }
                  }
               }
            ]
         }
      ]
   }
}

I'm trying to get just the two coordinates inside NavigationPosition.

Before I start the tedious work of creating a method to manually pull out the data I need from the unparsed string, does anyone have a solution? Is there a way to iterate anonymously through the json arrays using a foreach or if statement?

If the response is dynamic then one option is to use dynamic deserialization

var dynamicObject = JsonConvert.DeserializeObject<dynamic>(jsonAsString);

You can iterate this object and write defensive code by checking null. I am assuming that "NavigationPosition" will always lie under "location" and in turn under a list of "Result" under list of "View"

something like this.. (symbolic code)

if(dynamicObject.View != null && dynamicObject.View[0] != null && dynamicObject.View[0].Result[0] != null && dynamicObject.View[0].Result[0].Location != null  )
{
    var navigationPosition = dynamicObject.View[0].Result[0].Location.NavigationPosition;
    // do something with it
}

It seems really cumbersome but if you have no control over json response, I think you should be able to get it right after some iterations :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM