如何访问以星号命名的密钥?

时间:2015-03-18 21:37:31

标签: c# json json.net

维基媒体API中有一种方法可以提供本地化的标题。

示例:

云: http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Cloud&prop=langlinks&lllimit=500&lllang=ru&continue=

Rain:http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Rain&prop=langlinks&lllimit=500&lllang=ru&continue=

云响应:

{
   "batchcomplete":"",
   "query":{
      "pages":{
         "47515":{
            "pageid":47515,
            "ns":0,
            "title":"Cloud",
            "langlinks":[
               {
                  "lang":"ru",
                  "*":"\u041e\u0431\u043b\u0430\u043a\u0430"
               }
            ]
         }
      }
   }
}

雨水响应:

{
   "batchcomplete":"",
   "query":{
      "pages":{
         "19009110":{
            "pageid":19009110,
            "ns":0,
            "title":"Rain",
            "langlinks":[
               {
                  "lang":"ru",
                  "*":"Дождь"
               }
            ]
         }
      }
   }
}

重要说明:页面下的整数容器(例如19009110)总是不同的,因为它等于页面ID。

C#代码:

dynamic datacontainer_RUname2 = JObject.Parse(cleanJson_string_RUname);
String localizedName = datacontainer_RUname.[HERE SHOULD BE *];

如何访问以星号命名的键' *'?

2 个答案:

答案 0 :(得分:2)

    string content;
    using (var webClient = new WebClient())
    {
        const string url = "http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Cloud&prop=langlinks&lllimit=500&lllang=ru&continue=";
        content = webClient.DownloadString(url);
    }

    var obj = JObject.Parse(content);
    var query = obj["query"];
    var pages = query["pages"].Value<JObject>();
    var page = pages.PropertyValues().First();
    var langLinks = page["langlinks"].Values<JObject>();
    var firstLangLink = langLinks.First();
    var localizedName = firstLangLink["*"];

查看working demo with live data

答案 1 :(得分:1)

只需在对象上使用普通索引。

string localizedName = obj["*"];

在您的情况下...要访问您的对象,您可以在这两种情况下执行此查询。收集查询返回的所有链接:

var allLinks =
    from page in response.SelectToken("query.pages").Values()
    from link in page["langlinks"]
    select (string)link["*"];