Получить свойство Json, имя которого содержит некоторую строку - PullRequest
0 голосов
/ 14 января 2019

У меня нет типичного json, который я получаю при запросе профиля с userName (в примере я показываю, что будет, если я сделаю запрос с username1. Если я сделаю запрос с username2, тогда имя свойства будет "field_set_key=\"profile\",username=\"username2\""

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

Я не могу просто установить JsonProperty с некоторым именем, так как оно динамическое. Поэтому мне нужно как-то разобрать его вручную.

Да, выглядит просто, если я знаю, какой профиль запрашивается (какое имя пользователя передано).

Просто проанализировал строку json в некотором JObject, скомпонуйте это динамическое имя свойства и получите его значение, используя LINQ to JSON .

Но что можно сделать, если я не знаю имя пользователя, которое запрашивается? Могу ли я получить значение свойства, имя которого содержит некоторую строку (например, field_set_key=\"profile\"), используя вышеупомянутый LINQ to JSON в качестве примера?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Как сказал @ZoharPeled в комментарии, я могу использовать JsonPath для запроса json с помощью SelectToken Как показано в Запрос JSON с SelectToken

var jObject = JObject.Parse(json);

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

В примере я проанализировал свой json на JObject и из него выбрал данные профиля, используя SelectToken. Как видите, я также использовал там выражения JSONPath.

* означает

подстановочные. Все объекты / элементы независимо от их имен.

0 голосов
/ 14 января 2019

Привет, я нашел этот код в старом проекте, надеюсь, он поможет вам с некоторыми вещами! (это использовалось для автоматического заполнения адреса с помощью API карт Google) Я отправил это как ответ, потому что я не могу комментировать из-за 50 репутации: 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-ответ:

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

], "статус": "ОК" }

...