JSON.NET - 输出动态对象数据



我正在处理一个项目,该项目采用摄取的 JSON 文件并根据文件内容输出 UI。我的 JSON 看起来像这样:

{
"template" : {
"example" : {
"name" : "Name",
"wigglies" : [
{
"displayname" : "Artifact Spots"
}
],
"othersrc" : [
{
"displayname" : "Other Sources"
}
],
"reward" : "Donation Reward",
"drops" : [
{
"displayname" : "Monster Drops"
}
],
"price0base" : "Base Price",
"edibility" : "Edibility",
"iridium" : "",
"image" : ""
},
"metadata" : {
"author" : "Me",
"version" : "1.0",
"published" : "12/21/2019"
}
},
"content" : {
"categories" : [
{
"category" : "Artifacts",
"subcategories" : [
{
"subcategory" : "Artifacts",
"items" : [
{
"name" : "Amphibian Fossil",
"wigglies" : [
{
"name" : "Forest"
},
{
"name" : "Mountain"
}
],
"othersrc" : [
{
"name" : "Fishing Treasure Chest"
}
],
"price0base" : "150"
},
{
"name" : "Anchor",
"wigglies" : [
{
"name" : "The Beach"
}
],
"othersrc" : [
{
"name" : "Fishing Treasure Chest"
},
{
"name" : "Artifact Trove"
}
],
"price0base" : "100"
}
]
}
]
},
{
"category" : "Equipment",
"subcategories" : [
{
"subcategory" : "Refining",
"items" : [
{
"name" : "Charcoal Kiln"
},
{
"name" : "Crystalarium"
}
]
},
{
"subcategory" : "Artisan",
"items" : [
{
"name" : "Bee House"
},
{
"name" : "Cask"
}
]
}
]
}
]
}
}

我遇到的问题是如何以有用的方式返回此数据,同时允许在 Content.Categories.Category.Subcategories.Subcategory.Items 包含的数组中使用任意数据结构。我的示例 JSON 不是该数据的唯一结构;这只是一个例子。因此,那里也可能有更多的嵌套数组。

我知道我可以通过以下方式访问数据:

Content.Categories[0].Subcategories[0].Items[0]["name"]

不过,这会返回一个Json.Linq.Jtoken,这不是很有用。Items数组是一个JObject[]。我觉得我在这里错过了一些明显的东西。

我相信你正在寻找JToken的字符串表示。您可以通过分别对名称和项目使用.ToString().ToArray()来获得它。


JToken name = jsonFeed["content"]["categories"][0]["subcategories"][0]["items"][0]["name"];
string nameString = jsonFeed["content"]["categories"][0]["subcategories"][0]["items"][0]["name"].ToString();
JToken[] itemArray = jsonFeed["content"]["categories"][0]["subcategories"][0]["items"].ToArray();

你可以使用这个:

string jsonData = "";
dynamic templates = JsonConvert.DeserializeObject<dynamic>(jsonData);
var name = templates.example.Name;  // prints Name
var categories = templates.Content.Categories; // list of categories
// loop through the categories
// or do whatever

这样,您的代码更易于阅读和管理。

最新更新