C# 如何在C中用Json.net解析未知Json文件
我能够使用 动态obj=JsonConvert.DeserializeObjectjson 它似乎是一个嵌套的对象结构 我需要绘制json文件中的每个变量,但是json文件结构经常变化 有没有一种方法可以使用嵌套的foreach语句来解析这个结构? 如果不是,我可以通过像字典一样的字符串访问每个元素来解析它吗 例如:C# 如何在C中用Json.net解析未知Json文件,c#,json,windows,visual-studio-2017,json.net,C#,Json,Windows,Visual Studio 2017,Json.net,我能够使用 动态obj=JsonConvert.DeserializeObjectjson 它似乎是一个嵌套的对象结构 我需要绘制json文件中的每个变量,但是json文件结构经常变化 有没有一种方法可以使用嵌套的foreach语句来解析这个结构? 如果不是,我可以通过像字典一样的字符串访问每个元素来解析它吗 例如: if(obj["Item1"]["Parameter3"]["Value2"]` != NULL) int number = obj["Item1"]["Parameter3
if(obj["Item1"]["Parameter3"]["Value2"]` != NULL)
int number = obj["Item1"]["Parameter3"]["Value2"]`
谢谢,是的,有一个用于动态查询的API。 请参阅此处的文档: 代码如下所示:
JObject rss = JObject.Parse(json);
var postTitles =
from p in rss["channel"]["item"]
select (string)p["title"];
终于找到了这个api 一些JToken条目有一个值列表,其他条目有一个名称和值。在解析它之前,您必须对它进行排序 这将创建一个包含Json文件中每个条目的字典
void SomeFunction()
{
Dictionary<string, decimal> json_data = new Dictionary<string, decimal>();
dynamic json_obj = JsonConvert.DeserializeObject(json);
Linearize(ref json_data, json_obj);
}
void Linearize(ref Dictionary<string, decimal> input_dict, JToken json_data, string key = "")
{
int i;
if (json_data != null)
{
if (json_data.HasValues)
{
i = 0;
foreach (dynamic entry in json_data)
{
//Add a Name field if it exists
Type typeOfDynamic = entry.GetType();
if (typeOfDynamic.GetProperties().Where(p => p.Name.Equals("Name")).Any())
key += entry.Name + ".";
//If JToken is an Array
if (((JToken)entry).HasValues)
{
Linearize(ref input_dict, entry, key + "[" + i++ + "]" + ".");
}
//If JToken is a data type
else if (entry.Type == JTokenType.String || entry.Type == JTokenType.Float || entry.Type == JTokenType.Integer)
{
decimal output;
if (decimal.TryParse(entry.ToString(), out output))
input_dict.Add(key + "[" + i++ + "]", output);
}
}
}
}
}
可能是重复的,或者也许你不应该求助于思考,或者动力来完成你想要做的事情。这有点像用核弹打钉子。每个jtoken上都有一个类型,指示它是数组、原子对象、值还是数组。您可以使用它来迭代所有子级。您可以查询jtokens,查看是否有name属性,而不是添加反射。如果JToken恰好是一个JObject,那么您可以轻松获得所有属性