【问题标题】:How to access a key named with asterisk?如何访问以星号命名的密钥?
【发布时间】:2015-03-18 21:37:31
【问题描述】:

Wikimedia API 中有一个方法可以提供本地化的标题。

示例:

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

雨: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 *];

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

【问题讨论】:

  • 这不应该完全取决于将 JSON 反序列化为 C# 对象的代码吗?你在使用任何图书馆吗?您可以在问题中添加适当的标签和/或备注吗?
  • 附带说明:您提供的 json 无效...
  • @AndreasNiedermair 这是响应的一部分,请转到上面的链接并检查它

标签: c# json json.net


【解决方案1】:
    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

【讨论】:

  • 非常好!谢谢。但是....我无法为每个请求获取“var page”,因为它是动态变化的,它等于页面 id
  • @IvanFazaniuk 您应该将此添加到您的问题中:) 我会调整我的代码。
  • 对不起 :) 没想到深入解释会有这么多帮助 :)
  • 太棒了!非常简单并且完美运行。过去 2 天处理了一堆这样的请求,在这个答案之后,我应该去 SO 管理并要求他们删除 80% 的带有标签列表 C#、JSON、反序列化的答案
【解决方案2】:

只需对对象使用普通索引即可。

string localizedName = obj["*"];

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

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

【讨论】:

  • 你怎么看?所有JTokens 都可以使用索引器访问。假设对象引用指向包含属性的对象,它只需要被索引。问题问,How to access a key named with asterisk?...这就是答案。就我而言,弄清楚如何获得他想要访问的令牌不是我的工作,我们只能假设他拥有它。
  • 我当然理解你的观点,但是有一个例子清楚地表明 OP 没有正确的令牌。所以一定程度的帮助是必须的。将datacontainer_RUname.[HERE SHOULD BE *] 转换为datacontainer_RUname2["*"] 有点太明显了,不是吗?
  • 好吧,考虑到为了包含相关且正确的信息需要进行多次编辑,谁知道 的意图是什么。当我回答时,有很多遗漏并且完全错误,所以我回答了根据情况可以回答的问题。
  • 嘿,否决票不是最终的,是吗?感谢您的编辑!
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2023-02-12
相关资源
最近更新 更多