0

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?

demo
  • 6,038
  • 19
  • 75
  • 149
  • 1
    You can use [JsonPath](https://goessner.net/articles/JsonPath/) to query json using [SelectToken](https://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_Linq_JToken_SelectToken.htm) As shown in [Querying JSON with SelectToken](https://www.newtonsoft.com/json/help/html/SelectToken.htm). I don't currently have the time to test and write a complete answer but I would start digging in that direction. Just don't miss that left turn in Albuquerque. – Zohar Peled Jan 14 '19 at 10:29
  • @ZoharPeled, yeah, this is what I did! thx – demo Jan 14 '19 at 10:50
  • Well, if you have a working solution you should probably post it as an answer to your own question. Other people might benefit from it as well. – Zohar Peled Jan 14 '19 at 10:52

2 Answers2

1

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.

demo
  • 6,038
  • 19
  • 75
  • 149
0

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" }

Jeremie de Vos
  • 174
  • 1
  • 11