demo
demo

Reputation: 6235

Get Json property which name contains some string

I have not typical json that I get when request for profile with userName (in example I show what will be if I query with username1. If I query with username2 then property name is "field_set_key=\"profile\",username=\"username2\""

"UserProfileResource": {
    "field_set_key=\"profile\",username=\"username1\"": {
      "data": {
        "profile": {
          ...
        }
      }
    }
  }

I cannot simply set JsonProperty with some name as it is dynamic. So I need to parse it manually somehow.

Yes, it looks simple if I know what profile is requested (what username passed).

Just parsed json string into some JObject, build that dynamic property name and get it's value using LINQ to JSON.

But what can be done in case I don't know username that are requested? Can I get property value, which name contains some string (like field_set_key=\"profile\") using mentioned above LINQ to JSON as example?

Upvotes: 0

Views: 2211

Answers (2)

demo
demo

Reputation: 6235

As @ZoharPeled said in comment, I can use use JsonPath to query json using SelectToken As shown in Querying JSON with SelectToken

var jObject = JObject.Parse(json);

var userProfile = jObject.SelectToken("UserProfileResource.*.data.profile").ToObject<UserProfile>();

In example I parsed my json to JObject and from it select profile data using SelectToken. As you can see, I also used JSONPath expressions there.

* means

wildcard. All objects/elements regardless their names.

Upvotes: 1

Jeremie de Vos
Jeremie de Vos

Reputation: 184

Hi i found this code in a old project hope it will help you out with some things! (this was used to auto fill address using google maps API) I posted this as answer because i can't comment because of the 50 reputation:P

      //Get all adress components based on street-name & house-number
    public static List<Address> PostalcodeResults(string streetname, string number)
    {
        //Request url
        string url = @"https://maps.googleapis.com/maps/api/geocode/json?address=" + streetname + " " + number + "&result_type=street_address&key=" + API_Key;

        //Webrequest-streamreader
        WebRequest request = WebRequest.Create(url);
        WebResponse response = request.GetResponse();
        Stream data = response.GetResponseStream();
        StreamReader reader = new StreamReader(data);

        // json-formatted string from maps api
        string responseFromServer = reader.ReadToEnd();

        //Create lists for the results from the request
        JObject googleSearch = JObject.Parse(responseFromServer);
        IList<JToken> results = googleSearch["results"].Children().ToList();

        //list to return
        List<Address> list = new List<Address>();

        //foreach result
        foreach (JToken Result in results)
        {
            //Some local variable
            string street = "";
            string house_number = "";
            string zipcode = "";
            string country = "";
            string place = "";
            string provincie = "";
            string Township = "";

            //Foreach adress component from result
            foreach (JToken Adress_Components in Result.First().First())
            {
                //List with types
                IList<JToken> types = Adress_Components["types"].Children().ToList();

                //Foreach type
                foreach (JToken type in types)
                {
                    //determ witch Variable it is
                    if (type.ToString() == "route")
                        street = Adress_Components["long_name"].ToString();
                    else if (type.ToString() == "street_number")
                        house_number = Adress_Components["long_name"].ToString();
                    else if (type.ToString() == "postal_code")
                        zipcode = Adress_Components["long_name"].ToString();
                    else if (type.ToString() == "country")
                        country = Adress_Components["long_name"].ToString();
                    else if (type.ToString() == "locality")
                        place = Adress_Components["long_name"].ToString();
                    else if (type.ToString() == "administrative_area_level_1")
                        provincie = Adress_Components["long_name"].ToString();
                    else if (type.ToString() == "administrative_area_level_2")
                        Township = Adress_Components["long_name"].ToString();

                }
            }
            //MessageBox.Show(" Street: " + street + "\n House nr: " + house_number + "\n Zipcode: " + zipcode + "\n Country: " + country + "\n Place: " + place + "\n Province: " + provincie + "\n Township: " + Township);
            list.Add(new Address(street, house_number, zipcode, country, place, provincie, Township));
        }
        //return the lists
        return list;
    }

    //Get directions from one point to another
    private void getdirections()
    {
        string API_Key = "apikey";
        string url = @"https://maps.googleapis.com/maps/api/directions/json?origin=75+9th+Ave+New+York,+NY&destination=MetLife+Stadium+1+MetLife+Stadium+Dr+East+Rutherford,+NJ+07073&key=" + API_Key;

        WebRequest request = WebRequest.Create(url);
        WebResponse response = request.GetResponse();
        Stream data = response.GetResponseStream();
        StreamReader reader = new StreamReader(data);

        // json-formatted string from maps api
        string responseFromServer = reader.ReadToEnd();
        //richTextBox1.Text = responseFromServer;
    }
}

json response:

"results" : [
  {
     "address_components" : [
        {
           "long_name" : "Somepostalcode",
           "short_name" : "Somepostalcode",
           "types" : [ "postal_code" ]
        },
        {
           "long_name" : "Somelocality",
           "short_name" : "Somelocality",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "Someadministrative_area_level_2",
           "short_name" : "Someadministrative_area_level_2",
           "types" : [ "administrative_area_level_2", "political" ]
        },
        {
           "long_name" : "SOmeProvince",
           "short_name" : "SomeShortname",
           "types" : [ "administrative_area_level_1", "political" ]
        },
        {
           "long_name" : "SomeCountry",
           "short_name" : "SomeCountryShortage",
           "types" : [ "country", "political" ]
        }
     ],
     "formatted_address" : "foratted adress",
     "geometry" : {
        "bounds" : {
           "northeast" : {
              "lat" : ,
              "lng" : 
           },
           "southwest" : {
              "lat" : ,
              "lng" : 
           }
        },
        "location" : {
           "lat" : ,
           "lng" : 
        },
        "location_type" : "",
        "viewport" : {
           "northeast" : {
              "lat" : ,
              "lng" : 
           },
           "southwest" : {
              "lat" : ,
              "lng" : 
           }
        }
     },
     "place_id" : "",
     "types" : [ "postal_code" ]
  }

], "status" : "OK" }

Upvotes: 0

Related Questions