无法从GET请求解析JSON

时间:2015-12-09 04:38:31

标签: c# json linq deserialization

我试图将维基媒体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,但我不太了解它以构建正确的查询。

2 个答案:

答案 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解析为c#类,并且还使用其Linq to JSON

支持json的直接Linq查询

您没有包含您尝试过的c#课程,但是"页面" object可以反序列化为字典,例如:

public class Query
{
    // Property for "normalized" if needed.
    public Dictionary<string, Page> pages { get; set; }
}

请参阅Serialize a Dictionary

对于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