使用Json.NET读取Foursquare Json响应
本文关键字:Json 响应 Foursquare NET 使用 读取 | 更新日期: 2023-09-27 18:26:27
我正在尝试访问Foursquare响应中第一级的所有类别:-
{
"meta": {
"code": 200
},
"response": {
"categories": [{
"id": "4d4b7104d754a06370d81259",
"name": "Arts & Entertainment",
"pluralName": "Arts & Entertainment",
"shortName": "Arts & Entertainment",
"icon": {
"prefix": "https:'/'/foursquare.com'/img'/categories'/arts_entertainment'/default_",
"sizes": [32, 44, 64, 88, 256],
"name": ".png"
},
"categories": [{
"id": "4bf58dd8d48988d1e1931735"
使用JSON.NET:-
JObject o = JObject.Parse(FoursquareObject.GetCategories());
IList<string> categories = o.SelectToken("categories[0]").Select(s => (string)s).ToList();
其中FoursquareObject.GetCategories()
以字符串形式返回响应。我还试过:-
JArray categories = (JArray)o["categories"];
var categories = (string) o["response[0].categories"];
和的许多变体,只是为了查看变量中的响应,并且总是得到"Object reference"或"cannot be{null}"错误。我知道我很接近,但就我的一生而言,我不知道如何获得回应的"类别"部分。。。
有人能给我指正确的方向吗?
感谢您的帮助。)
更新:
感谢L.B和Meklarian的回答,我添加了这个代码(和的变体):-
dynamic four = JsonConvert.DeserializeObject(FoursquareObject.GetCategories());
foreach (var cat in four)
{
context.Response.Write(cat.response.categories.id);
}
但无论我在Write()
中尝试什么,我总是得到:-
"Newtonsoft.Json.Linq.JProperty"不包含的定义"响应"
我尝试了很多组合,但没有成功。我检查了JSON文件的输出,得到了作为字符串的纯JSON响应。只是需要注意的是,类别可以存在于类别中,因此JSON看起来很糟糕。我向你保证不是。我完全被卡住了!
有多种解析方法;但是在您最初呈现的样式中,您应该尝试使用[]
索引器来访问它。
请注意,您的数据有一个具有两个属性的根对象,即meta
和response
。假设response
不能为null,您可以直接从它访问categories
,如下所示:
var root = JObject.Parse(/* your json string here */);
var categories = root["response"]["categories"];
var firstCategory = categories[0];
请注意,您可以使用与属性名称匹配的字符串来下降到嵌套级别,使用整数来索引范围中的数组。
下面是一个示例程序的其余部分,它可以解析您提供的json片段。
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
namespace _4sqCatResponse
{
class Program
{
[STAThread]
static void Main(string[] args)
{
OpenFileDialog dlg = new OpenFileDialog();
if(dlg.ShowDialog() != DialogResult.OK){return;}
string json = System.IO.File.ReadAllText(dlg.FileName);
var root = JObject.Parse(json);
var categories = root["response"]["categories"];
var firstCategory = categories[0];
Console.WriteLine("id: {0}", firstCategory["id"]);
Console.WriteLine("name: {0}", firstCategory["name"]);
Console.WriteLine("pluralName: {0}", firstCategory["pluralName"]);
Console.WriteLine("shortName: {0}", firstCategory["shortName"]);
var icon = firstCategory["icon"];
Console.WriteLine("icon.prefix: {0}", icon["prefix"]);
Console.WriteLine("icon.sizes[0]: {0}", icon["sizes"][0]);
Console.WriteLine("icon.name: {0}", icon["name"]);
Console.ReadKey();
}
}
}
此外,我对您的json示例有点困惑;我认为您可能已经覆盖了样本的一部分,或者在类别中嵌套了类别时剪切了一些内容。如果你的类别元素中确实有一个二级类别,这就是你想要的,你可以用这个来访问它:
var categories2 = root["response"]["categories"][0]["categories"][0];
Console.WriteLine("inner categories id: {0}", categories2["id"]);
这是我用来测试的json源代码,它是从您的源代码复制的,但在需要进行解析的地方带有关闭的}
和]
标记。
{
"meta": {
"code": 200
},
"response": {
"categories": [{
"id": "4d4b7104d754a06370d81259",
"name": "Arts & Entertainment",
"pluralName": "Arts & Entertainment",
"shortName": "Arts & Entertainment",
"icon": {
"prefix": "https:'/'/foursquare.com'/img'/categories'/arts_entertainment'/default_",
"sizes": [32, 44, 64, 88, 256],
"name": ".png"
},
"categories": [{
"id": "4bf58dd8d48988d1e1931735"
}]
}]
}
}
我认为这应该能在中工作
dynamic four2 = JsonConvert.DeserializeObject(FoursquareObject.GetCategories());
foreach(var cat in four2.response.categories)
{
Console.WriteLine(cat.id + " " + cat.name + " " + cat.icon.prefix);
}
使用http://json2csharp.com/要生成C#类,请使用RootObject,然后访问各个场地