【问题标题】:Get Json property which name contains some string获取名称包含某些字符串的 Json 属性
【发布时间】:2019-01-14 10:11:45
【问题描述】:

当我使用用户名请求配置文件时,我没有得到典型的 json(例如,我展示了如果我使用 username1 查询会发生什么。如果我使用 username2 查询,那么属性名称是 "field_set_key=\"profile\",username=\"username2\""

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

我不能简单地用某个名称设置JsonProperty,因为它是动态的。所以我需要以某种方式手动解析它。

是的,如果我知道请求什么配置文件(传递了什么用户名),这看起来很简单。

只需将 json 字符串解析为一些 JObject,构建该动态属性名称并使用 LINQ to JSON 获取它的值。

但是,如果我不知道所请求的用户名,该怎么办?我可以使用上面提到的 LINQ to JSON 作为示例来获取属性值,该名称包含一些字符串(如field_set_key=\"profile\")吗?

【问题讨论】:

  • 可以使用JsonPath查询json,使用SelectTokenQuerying JSON with SelectToken所示。我目前没有时间测试和写一个完整的答案,但我会开始朝那个方向挖掘。千万不要错过阿尔伯克基的左转。
  • @ZoharPeled,是的,这就是我所做的!谢谢
  • 好吧,如果您有一个可行的解决方案,您可能应该将其发布为您自己问题的答案。其他人也可能从中受益。

标签: c# json json.net linq-to-json


【解决方案1】:

正如@ZoharPeled 在评论中所说,我可以使用JsonPath 使用SelectToken 查询json 如Querying JSON with SelectToken 所示

var jObject = JObject.Parse(json);

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

在示例中,我将我的 json 解析为 JObject,然后使用 SelectToken 从中选择配置文件数据。如您所见,我在那里也使用了 JSONPath 表达式。

* 表示

通配符。所有对象/元素,无论其名称。

【讨论】:

    【解决方案2】:

    您好,我在一个旧项目中发现了这段代码,希望它能帮助您解决一些问题! (这用于使用谷歌地图 API 自动填写地址) 我将其发布为答案,因为由于 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" ]
      }
    

    ], “状态”:“好的” }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2021-08-29
      • 2021-12-05
      • 2011-09-30
      相关资源
      最近更新 更多