使用JSON.Net/C#读取JSON数据中的根值
很抱歉,我问了一个类似裸体的问题,但退休一段时间后,我发现自己忘记了一些事情 给定此示例json字符串:使用JSON.Net/C#读取JSON数据中的根值,c#,json,json.net,C#,Json,Json.net,很抱歉,我问了一个类似裸体的问题,但退休一段时间后,我发现自己忘记了一些事情 给定此示例json字符串: { "range": [ { "num": 0 }, { "num": 1 }, { "num": 2 }, { "num": 3 }, { "num": 4 }, { "num": 5 }, { "num": 6 }, { "num": 7 },
{
"range": [
{ "num": 0 },
{ "num": 1 },
{ "num": 2 },
{ "num": 3 },
{ "num": 4 },
{ "num": 5 },
{ "num": 6 },
{ "num": 7 },
{ "num": 8 },
{ "num": 9 }
],
"friends": [
{
"id": 0,
"name": "Christian Cruz"
},
{
"id": 1,
"name": "Hunter Moon"
},
{
"id": 2,
"name": "Holden Gentry"
}
]
}
我希望能够读取数据中每一行的根值(在本例中为“range”和“friends”),然后解析其余的值
void Main()
{
var json = File.ReadAllText(@"c:\data\sample.json");
JObject obj = JObject.Parse(json);
foreach(JProperty child in obj.Children())
{
}
}
当我遍历children集合(foreach(JProperty child…)时,我陷入了困境。我可以读取数组中的项(例如“num”、“id”和“name”),但无法读取根值(例如“range”和“friends”)
非常感谢您能借给老人的任何帮助。将其反序列化为C对象要容易得多,例如:
public class RootObject
{
public List<Range> range { get; set; }
public List<Friend> friends { get; set; }
}
public class Range
{
public int num { get; set; }
}
public class Friend
{
public int id { get; set; }
public string name { get; set; }
}
将其反序列化为C#对象要容易得多,例如:
public class RootObject
{
public List<Range> range { get; set; }
public List<Friend> friends { get; set; }
}
public class Range
{
public int num { get; set; }
}
public class Friend
{
public int id { get; set; }
public string name { get; set; }
}
使用下面的这个小递归函数,您可以解压JSON以查看属性和值,而无需创建任何类
static void Main(string[] args)
{
var json = "{\"range\":[{\"num\":0},{\"num\":1},{\"num\":2},{\"num\":3},{\"num\":4},{\"num\":5},{\"num\":6},{\"num\":7},{\"num\":8},{\"num\":9}],\"friends\":[{\"id\":0,\"name\":\"Christian Cruz\"},{\"id\":1,\"name\":\"Hunter Moon\"},{\"id\":2,\"name\":\"Holden Gentry\"}]}";
JObject obj = JObject.Parse(json);
void UnpackJson(JToken jobj, int indent)
{
if (jobj == null)
return;
var name = (jobj as JProperty)?.Name;
if (name != null)
{
Console.Write(new string(' ', indent) + name + " :\n");
indent += 4;
}
foreach (var child in jobj.Children())
{
var chname = (child as JProperty)?.Name;
if (chname != null)
Console.Write(new string(' ', indent) + chname + " : ");
var value = (child as JProperty)?.Value;
if (child.Values().Count() > 1)
{
if (chname != null || name != null)
Console.WriteLine();
IEnumerable<JToken> jt = (value is JArray) ? child.Values() : child.Children();
foreach (var val in jt)
UnpackJson(val, indent + 4);
}
else
{
if (value != null)
Console.WriteLine(value);
}
}
}
UnpackJson(obj, 0);
Console.Read();
}
使用下面的这个小递归函数,您可以解压JSON以查看属性和值,而无需创建任何类
static void Main(string[] args)
{
var json = "{\"range\":[{\"num\":0},{\"num\":1},{\"num\":2},{\"num\":3},{\"num\":4},{\"num\":5},{\"num\":6},{\"num\":7},{\"num\":8},{\"num\":9}],\"friends\":[{\"id\":0,\"name\":\"Christian Cruz\"},{\"id\":1,\"name\":\"Hunter Moon\"},{\"id\":2,\"name\":\"Holden Gentry\"}]}";
JObject obj = JObject.Parse(json);
void UnpackJson(JToken jobj, int indent)
{
if (jobj == null)
return;
var name = (jobj as JProperty)?.Name;
if (name != null)
{
Console.Write(new string(' ', indent) + name + " :\n");
indent += 4;
}
foreach (var child in jobj.Children())
{
var chname = (child as JProperty)?.Name;
if (chname != null)
Console.Write(new string(' ', indent) + chname + " : ");
var value = (child as JProperty)?.Value;
if (child.Values().Count() > 1)
{
if (chname != null || name != null)
Console.WriteLine();
IEnumerable<JToken> jt = (value is JArray) ? child.Values() : child.Children();
foreach (var val in jt)
UnpackJson(val, indent + 4);
}
else
{
if (value != null)
Console.WriteLine(value);
}
}
}
UnpackJson(obj, 0);
Console.Read();
}
您可以使用SelectTokens,将json放入列表,然后遍历JProperty
var files = JObject.Parse(YourJson);
var recList = files.SelectTokens("$").ToList();
foreach (JProperty item in recList.Children())
{
var key = item.Name.ToString(); //store the root item here
var value = item.Value.ToString();
//Do your stuffs
}
您可以使用SelectTokens,将json放入列表,然后遍历JProperty
var files = JObject.Parse(YourJson);
var recList = files.SelectTokens("$").ToList();
foreach (JProperty item in recList.Children())
{
var key = item.Name.ToString(); //store the root item here
var value = item.Value.ToString();
//Do your stuffs
}
如果对其进行反序列化,则生成的类将在一行或两行代码中包含两个集合;查看每个
子项的Name
属性时,会如预期的那样显示该属性的名称:如果对其进行反序列化,则生成的类将在一行或两行代码中包含两个集合;查看 每个子对象的Name
属性按照预期显示属性的名称:或者,如果你不想创建一堆类,只需使用动态
对象:@HereticsMonkey,不。如果我的一个开发人员给我带来了这些,我会告诉他们去创建这些类。这样做很简单,甚至有些网站也会这样做你。当然,但既然OP提到他退休了,我想这是一个安全的赌注,它不是为了专业工作…:)专业与否,我相信OP更愿意用“正确”的方式做事“正确”的方式是重命名这些类/属性以遵循约定:)(我见过太多人在生产代码中离开RootObject
)如果你想跳过一堆类的制作,也可以使用动态对象:@HereticMonkey,不。如果我的一个开发人员把它带给我,我会告诉他们去制作这些类。这件事很简单,甚至有网站为你做。当然,但既然OP提到他退休了,我想这是一个安全的赌注,它不适合你专业工作…:)专业与否,我相信OP更愿意用“正确”的方式做事“正确”的方式是重命名这些类/属性以遵循约定:)(我已经看到太多人在生产代码中离开RootObject
)