我希望能够打印类型,名称和子条目,但是我对方法一无所知。我可以访问数组的特定位置而不是命名所需的属性吗?
main属性具有项属性,例如mainProperty.entries,我可以使用foreach将字符串拉出。但是,当“条目”具有没有名称的属性时,我不知道如何访问它们。
我知道“此处的输入文本”是JValues,其他是JObjects。
可以通过mainProperty.entries访问没有对象的条目。 由于其他类型没有名称,因此我不知道如何访问类型,名称和“子”条目。 (mainProperty.JObject.type)
{
"mainProperty": [
{
"entries": [
"Entry text here",
{
"type": "entries",
"name": "Entry of entry",
"entries": [
"Entry text here"
]
},
{
"type": "entries",
"name": "Entry of entry",
"entries": [
"Entry text here"
]
}
]
}
]
}
{
"mainProperty": [
{
"entries": [
"Entry text here",
"Second line of text"
]
}
]
}
foreach (var entry in mainProperty.entries)
{
debugOutput(entry.GetType().ToString());
//debugOutput("\t" + (string)entry);
}
输出应为:
第一个示例:
Entry text here
**Entry of entry** Entry text here
**Entry of entry** Entry text here
第二个示例:
Entry text here
Second line of text
答案 0 :(得分:0)
如果您这样修改JSON数据:
var response = {
"mainProperty": [{
"entries": [{
"type": "entries",
"name": "Entry of entry",
"entries": [
"Entry text here"
]
},
{
"type": "entries",
"name": "Entry of entry",
"entries": [
"Entry text here"
]
}
]
}]
}
您必须创建Response对象,但首先,需要从NuGet将NewtonSoft.Json添加到您的项目中。将此库添加到您的项目后,您需要创建如下的Response对象:
public class Entry
{
public string type { get; set; }
public string name { get; set; }
public List<string> entries { get; set; }
}
public class MainProperty
{
public List<Entry> entries { get; set; }
}
public class RootObject
{
public List<MainProperty> mainProperty { get; set; }
}
比您可以访问的数据还要多:
var _res = JsonConvert.DeserializeObject<RootObject>(response.ToString());
foreach(var item in _res.mainProperty.entries.entries)
{
debugOutput(item);
}
答案 1 :(得分:0)
在JSON中,flex-box order
是混合类型的数组,其中的值可以是字符串或对象。如果它们是对象,则每个子对象都有一个entries
属性,该属性的值也是一个数组。在您的示例中,该内部数组似乎总是包含字符串,但是看起来它实际上可能是完全递归的结构,其中子条目可以包含子子条目,依此类推。如果是这样,您将需要一个递归方法来转储条目。这样的事情可能会起作用:
entries
然后将其与JSON一起使用:
public static void DumpEntries(JObject obj, string indent = "")
{
JArray entries = (JArray)obj["entries"];
if (entries != null)
{
foreach (JToken entry in entries)
{
if (entry.Type == JTokenType.String)
{
debugOutput(indent + entry.ToString());
}
else if (entry.Type == JTokenType.Object && (string)entry["type"] == "entries")
{
debugOutput(indent + "**" + (string)entry["name"] + "**");
DumpEntries((JObject)entry, indent + " ");
}
}
}
}
提琴:https://dotnetfiddle.net/MjRNGn
回答您的原始问题,
是否可以访问数组的特定位置而不是命名所需的属性?
是的,您绝对可以做到。
例如,如果您想获取第三个条目的第一个子条目,则可以执行以下操作:
var root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
DumpEntries(obj);
}