c# - 访问具有可变键名的 JSON 项

标签 c# json mediawiki wikidata wikidata-api

以下是我的 JSON 数据,它恰好是维基数据提供的格式,尽管为了清晰起见进行了大幅缩减。

{
"entities": {
    "Q200405": {
        "id": "Q200405",
        "type": "item",
        "claims": "Cheese"
        }
    }
}

我试图在 C# 中访问这些数据。我的问题是 Q200405 是动态的——它基本上是我正在检索的记录号。例如,另一个页面可能会给我

{
"entities": {
    "Q123456": {
        "id": "Q123456",
        "type": "item",
        "claims": "Lemon"
        }
    }
}

到目前为止,我最好的尝试是使用 Json.NET (Newtonsoft) ;

json = "{\"entities\":{\"Q200405\" {\"id\":\"Q200405\",\"type\":\"item\",\"claims\":\"Cheese\"}}}";

var Query = JsonConvert.DeserializeObject<dynamic>(json);
string entities = Query.entities.ToString();

Query = JsonConvert.DeserializeObject<dynamic>(entities);
string entity = Query.Q200405.ToString();

Query = JsonConvert.DeserializeObject<dynamic>(entity);
string id = Query.id.ToString();
string claims = Query.claims.ToString();

这可行,但显然硬编码 Query.Q200405.ToString() 不是理想的解决方案!我可能也不应该执行多个反序列化语句来深入研究数据吗?

我的问题是将上述 JSON 格式读入 C# 程序的最佳方法是什么?

最佳答案

好吧,如果您想将名称放入字符串变量中,只需使用 JObject:

string id = "Q200405"; // Or wherever you get that from
string text = "{\"entities...";
var json = JObject.Parse(text);

var claim = json["entities"][id];

string claims = (string) claim["claims"];
string type = (string) claim["type"];
// etc

基本上,LINQ to JSON 正是您想要的。

编辑:如果您事先不知道 ID,您可以使用:

var json = JObject.Parse(text);
var entities = (JObject) json["entities"];
var entity = entities.Properties().First();
var id = entity.Name;
var claim = (JObject) entity.Value;
string claims = (string) claim["claims"];
string type = (string) claim["type"];
Console.WriteLine(new { claims, type, id });

关于c# - 访问具有可变键名的 JSON 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27557301/

相关文章:

javascript - 解析 JSON 字符串的问题

python - 如何在保留矩阵维度的同时序列化 numpy 数组?

namespaces - MediaWiki {{PAGENAME}} 包含命名空间

c# - 从 Net Core 3.1 迁移到 Net 6 期间,以下方法或属性之间的调用不明确

C# 断点改变行为

javascript - 访问嵌套在数组内的 JSON 对象

mysql - 我可以在安装后从 MediaWiki 撤销某些数据库权限吗?

c# - Access插入数据库时​​出现SQL语法错误

c# - 在 .nuget 包中打包内容文件的最简洁方法

javascript - 如何从维基百科检索内容以进行大量冗长的查询?