反序列化没有属性名称的JObject

时间:2019-05-24 13:05:28

标签: c# json.net

我希望能够打印类型,名称和子条目,但是我对方法一无所知。我可以访问数组的特定位置而不是命名所需的属性吗?

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

2 个答案:

答案 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);
}

提琴:https://dotnetfiddle.net/sMyMxH