Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化没有属性名的JObject_C#_Json.net - Fatal编程技术网

C# 反序列化没有属性名的JObject

C# 反序列化没有属性名的JObject,c#,json.net,C#,Json.net,我希望能够打印类型、名称和子条目,但不知如何打印。我可以访问数组的特定位置而不是命名所需的属性吗 main属性有条目属性,比如mainProperty.entries,我可以使用foreach提取字符串。但是当“条目”的属性没有名称时,我不知道如何访问它们 我知道“这里的输入文本”是jvalue,其他的是jobject 可以通过mainProperty.entries访问没有对象的条目。 由于另一个类型没有名称,我不知道如何访问类型、名称和“sub”条目。(mainProperty.JObjec

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

main属性有条目属性,比如mainProperty.entries,我可以使用foreach提取字符串。但是当“条目”的属性没有名称时,我不知道如何访问它们

我知道“这里的输入文本”是jvalue,其他的是jobject

可以通过mainProperty.entries访问没有对象的条目。 由于另一个类型没有名称,我不知道如何访问类型、名称和“sub”条目。(mainProperty.JObject.type)

输出应为:

第一个例子:

第二个例子:


如果您这样修改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"
                ]
            }
        ]
    }]
}
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 root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
    DumpEntries(obj);
}
您必须创建响应对象,但首先,需要从NuGet将NewtonSoft.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"
                ]
            }
        ]
    }]
}
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 root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
    DumpEntries(obj);
}
公共类条目
{
公共字符串类型{get;set;}
公共字符串名称{get;set;}
公共列表项{get;set;}
}
公共类主属性
{
公共列表项{get;set;}
}
公共类根对象
{
公共列表mainProperty{get;set;}
}
然后您可以访问您的数据:

var _res = JsonConvert.DeserializeObject<RootObject>(response.ToString());

foreach(var item in _res.mainProperty.entries.entries)
{
     debugOutput(item);
}
var\u res=JsonConvert.DeserializeObject(response.ToString());
foreach(在_res.mainProperty.entries.entries中的变量项)
{
输出(项);
}

如果您这样修改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"
                ]
            }
        ]
    }]
}
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 root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
    DumpEntries(obj);
}
您必须创建响应对象,但首先,需要从NuGet将NewtonSoft.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"
                ]
            }
        ]
    }]
}
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 root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
    DumpEntries(obj);
}
公共类条目
{
公共字符串类型{get;set;}
公共字符串名称{get;set;}
公共列表项{get;set;}
}
公共类主属性
{
公共列表项{get;set;}
}
公共类根对象
{
公共列表mainProperty{get;set;}
}
然后您可以访问您的数据:

var _res = JsonConvert.DeserializeObject<RootObject>(response.ToString());

foreach(var item in _res.mainProperty.entries.entries)
{
     debugOutput(item);
}
var\u res=JsonConvert.DeserializeObject(response.ToString());
foreach(在_res.mainProperty.entries.entries中的变量项)
{
输出(项);
}

在JSON中,
条目是一个混合类型的数组,其中的值可以是字符串或对象。如果它们是对象,则每个子对象都有一个
entries
属性,其值也是一个数组。在您的示例中,这个内部数组似乎总是包含字符串,但看起来它实际上可能是一个完全递归的结构,其中子项可以包含子项等等。如果是这样,则需要一个递归方法来转储条目。类似这样的方法可能会奏效:

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 + "  ");
            }
        }
    }
}
然后将其与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"
                ]
            }
        ]
    }]
}
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 root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
    DumpEntries(obj);
}
小提琴:

在回答你原来的问题时,

我可以访问数组的特定位置而不是命名所需的属性吗

是的,你绝对可以做到

例如,如果要获取第三个条目的第一个子条目,可以执行以下操作:

var root = JObject.Parse(json);
var sub = root["mainProperty"][0]["entries"][2]["entries"][0];
debugOutput((string)sub);

Fiddle:

在JSON中,
条目是一个混合类型的数组,其中的值可以是字符串或对象。如果它们是对象,则每个子对象都有一个
entries
属性,其值也是一个数组。在您的示例中,这个内部数组似乎总是包含字符串,但看起来它实际上可能是一个完全递归的结构,其中子项可以包含子项等等。如果是这样,则需要一个递归方法来转储条目。类似这样的方法可能会奏效:

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 + "  ");
            }
        }
    }
}
然后将其与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"
                ]
            }
        ]
    }]
}
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 root = JObject.Parse(json);
foreach (JObject obj in (JArray)root["mainProperty"])
{
    DumpEntries(obj);
}
小提琴:

在回答你原来的问题时,

我可以访问数组的特定位置而不是命名所需的属性吗

是的,你绝对可以做到

例如,如果要获取第三个条目的第一个子条目,可以执行以下操作:

var root = JObject.Parse(json);
var sub = root["mainProperty"][0]["entries"][2]["entries"][0];
debugOutput((string)sub);

小提琴手:

很不清楚你想从你的描述中得到什么。是否可以显示所需的输出?MainProperty有两个名为条目的属性?“对象中的名称应该是唯一的”使用按钮“名称都是唯一的对象是可互操作的,因为接收该对象的所有软件实现都将在名称-值映射上达成一致。当对象中的名称不唯一时,接收此类对象的软件的行为是不可预测的。许多实现只报告姓氏/值对。其他实现报告错误或无法解析对象,一些实现报告所有名称/值对,包括重复项。“此JSON无效。复制/粘贴它,因为您不清楚您试图从描述中获得什么。您能显示所需的输出吗?MainProperty有两个名为entries的属性吗?”对象中的名称应该是唯一的“使用按钮”名称都是唯一的对象是可互操作的,因为接收该对象的所有软件实现都将同意名称-值映射。当对象中的名称不唯一时,接收此类对象的软件的行为是不可预测的。许多实现只报告姓氏/值对。其他实现报告错误或无法解析对象,一些实现报告所有名称/值对,包括重复项。“此JSON无效。将其复制/粘贴到JSON方案中,但不会修改。只有太多的文件和条目才能使它可行。不幸的是,JSON方案不会被修改。只有太多的文件和条目,它才是可行的。