在C#中解析JSON API

16

我相对编程还比较新,但想深入了解它。最近,我加入了一个项目,为一个使用JSON API系统的网站创建一个WinForm程序。

我以前从未使用过API,所以不太清楚它的工作原理,但经过几分钟的观察,我似乎已经理解了要领。我不明白的是如何在C#中精确解析JSON。

在谷歌搜索一番后,我找到了这个链接。我用了这段代码让它(有点)工作了。

static void Main(string[] args)
{
        WebClient c = new WebClient();
        var vLogin = c.DownloadString("https://www.openraid.us/index.php/api/login/username/password");
        //Returns string 
        //{"status":1,"error":null,"token":"250-1336515541-c48d354d96e06d488d1a2530071ef07c9532da26"} 
        //Token = random, no decisive length*/
        JObject o = JObject.Parse(vLogin);
        Console.WriteLine("Login Status: " + o["status"]);
        String sToken = "" + o["token"];
        Console.WriteLine(sToken);
        Console.WriteLine("");
        //Breaks after this
        var myRaids = c.DownloadString("https://www.openraid.us/index.php/api/myraids/"+sToken);
        JObject r = JObject.Parse(myRaids); //error occurs here
        String sEventId = "" + r["event_id"];
        Console.WriteLine("Event ID: " + sEventId);
        Console.ReadLine();
}

据我看,第一页的解析完成了且处理正常,但当我转到第二页时,出现了这个错误。

从JsonReader读取JObject时出错。当前JsonReader项不是对象:StartArray。路径“”,行1,位置1。

所以,我的问题是,如何解析多个页面或调用JSON,并将每个JSON对象的每个部分(例如statuserrortoken)分解为C#字符串?


2
从外观上看,第二个请求没有返回有效的JSON。您是否已经验证返回的数据与您想要的数据相符? - Nathan Taylor
好的,令牌(token)从不保持不变,但其有效期为24小时。我手动在浏览器中打开了API,然后收到了这个。所以对我来说,它看起来像是有效的JSON格式,但错误可能出现在调用下载带有sToken结尾的字符串上。 - Cistoran
1
从功能上看,你的代码看起来很好;此外,你提供的JSON响应似乎是有效的。有可能你调用DownloadString()时返回了其他内容吗?为了保持清醒,请尝试打印出该方法调用返回的确切内容而不进行解析。 - Nathan Taylor
我在这方面支持Nathan。在c.DownloadString之后,将字符串myRaids写出或在该行上立即放置一个调试器。我将你的JSON粘贴到http://json2csharp.com/中,并从中创建了一个有效的C#对象。 - NotMe
我在执行DownloadString后立即进行输出,它可以正常显示数据,但我不知道接下来该怎么做,如果无法解析字符串,我该如何拆分它? - Cistoran
3个回答

45

你尝试过使用JArray吗?根据你尝试返回的对象类型不同会有不同的结果。

WebClient client = new WebClient();
var data = client.DownloadString("");
var jArray = JArray.Parse(data);

2
+1 可能在文档中有提到,但人们期望 JSON.Net API 更加直观一些... 感谢您的回答 :-) - Jonno

2
JSON需要在数组中使用括号,在多个对象之间使用逗号。
这符合JSON标准。我还建议除非过于庞大且不能有额外的负担,否则请使用NuGet上的JSON.net而不是本地的JSON解析器。
例如,您正在解析一个包含两个单独的JSON对象的文件-以下内容不符合JSON标准(缺少两个对象之间的逗号,并且两个对象没有被括号包围):
{"status":1,"error":null}
{"status":2,"error":null}

以下3个从文件中解析出来的JSON对象是有效的(有多个对象的括号和对象之间的逗号):
[{"glossary": {"title": "fun glossary","SeeAlso": ["GML", "XML"]},
{"glossary": {"title": "grey glossary","SeeAlso": ["GML", "XML"]},
{"glossary": {"title": "blue glossary","SeeAlso": ["GML", "XML"]}]

0

你可以使用for循环将每个JSON对象(数组)切分成更多的对象,C# API是System.Json。

var jsonArray = JsonArray.Parse(st);//st is the string which contain the JSON objects
foreach (var item in jsonArray) {
    JsonObject ob = new JsonObject(item);
    foreach (var t in ob.Values) {
        JsonObject oo = new JsonObject(t);
        foreach (var x in oo) {
            textBox1.AppendText(x.Key + “ : ” + x.Value + “\n”);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接