C# 反序列化没有属性名的JObject
我希望能够打印类型、名称和子条目,但不知如何打印。我可以访问数组的特定位置而不是命名所需的属性吗 main属性有条目属性,比如mainProperty.entries,我可以使用foreach提取字符串。但是当“条目”的属性没有名称时,我不知道如何访问它们 我知道“这里的输入文本”是jvalue,其他的是jobject 可以通过mainProperty.entries访问没有对象的条目。 由于另一个类型没有名称,我不知道如何访问类型、名称和“sub”条目。(mainProperty.JObject.type) 输出应为: 第一个例子: 第二个例子:C# 反序列化没有属性名的JObject,c#,json.net,C#,Json.net,我希望能够打印类型、名称和子条目,但不知如何打印。我可以访问数组的特定位置而不是命名所需的属性吗 main属性有条目属性,比如mainProperty.entries,我可以使用foreach提取字符串。但是当“条目”的属性没有名称时,我不知道如何访问它们 我知道“这里的输入文本”是jvalue,其他的是jobject 可以通过mainProperty.entries访问没有对象的条目。 由于另一个类型没有名称,我不知道如何访问类型、名称和“sub”条目。(mainProperty.JObjec
如果您这样修改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方案不会被修改。只有太多的文件和条目,它才是可行的。