【问题标题】:How to parse unknown Json file with Json.net in C#如何在 C# 中使用 Json.net 解析未知的 Json 文件
【发布时间】:2019-08-28 05:36:26
【问题描述】:
我可以使用
获取动态 Json 对象
dynamic obj = JsonConvert.DeserializeObject(json);
好像是嵌套的对象结构
我需要绘制json文件中的每个变量,但是json文件结构经常变化
有没有办法使用嵌套的 foreach() 语句解析这个结构?
如果没有,我可以通过像字典这样的字符串访问每个元素来解析它吗?
例如:
if(obj["Item1"]["Parameter3"]["Value2"]` != NULL)
int number = obj["Item1"]["Parameter3"]["Value2"]`
谢谢,
【问题讨论】:
标签:
c#
json
windows
visual-studio-2017
json.net
【解决方案2】:
终于搞定了这个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);
}
}
}
}
}