我试图将维基媒体API集成到我正在创建的程序中,但是我在从GET请求返回的JSON中解析出我想要的内容时遇到了问题。这是GET请求返回的JSON:
{
"batchcomplete": "",
"query": {
"normalized": [
{
"from": "program",
"to": "Program"
}
],
"pages": {
"23771": {
"pageid": 23771,
"ns": 0,
"title": "Program",
"revisions": [
{
"contentformat": "text/x-wiki",
"contentmodel": "wikitext",
"*": "the page content is too long to reasonably post here"
}
]
}
}
}
}
我想要的只是字符串或数组中的title
和*
值或泛型,我可以轻松输出回控制台窗口进行读取的任何内容,但考虑到{{1} }放在页面 number 下面,它不能轻易反序列化。我已经尝试过LINQ,但我不太了解它以构建正确的查询。
答案 0 :(得分:0)
如果你不介意额外的依赖,JSON.Net会这样做
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
string str = @"{
""batchcomplete"": """",
""query"": {
""normalized"": [
{
""from"": ""program"",
""to"": ""Program""
}
],
""pages"": {
""23771"": {
""pageid"": 23771,
""ns"": 0,
""title"": ""Program"",
""revisions"": [
{
""contentformat"": ""text/x-wiki"",
""contentmodel"": ""wikitext"",
""*"": ""the page content is too long to reasonably post here""
}
]
}
}
}
}";
var json = JObject.Parse(str);
var pages = json["query"]["pages"].Values().First();
Console.WriteLine(pages["title"]);
Console.WriteLine(pages["revisions"][0]["*"]);
}
}
}
答案 1 :(得分:0)
您可以使用json.net来实现此目的。它将JSON解析为c#类,并且还使用其Linq to JSON
支持json的直接Linq查询您没有包含您尝试过的c#课程,但是"页面" object可以反序列化为字典,例如:
public class Query
{
// Property for "normalized" if needed.
public Dictionary<string, Page> pages { get; set; }
}
对于LINQ查询,您可以将JSON字符串解析为JToken
,然后使用JToken.SelectTokens()
。此方法支持使用包含通配符的JSONPath query syntax查询JSON对象:
var root = JToken.Parse(jsonString);
var pages = root.SelectTokens("query.pages.*").ToList();
var titles = pages.Select(p => (string)p.SelectToken("title")).ToList();
var revisions = pages.Select(p => p.SelectTokens("revisions[*]['*']").Select(s => (string)s)).ToList();
JSONPath查询语法在此处描述:JSONPath - XPath for JSON。