Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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# 如何在C中用Json.net解析未知Json文件_C#_Json_Windows_Visual Studio 2017_Json.net - Fatal编程技术网

C# 如何在C中用Json.net解析未知Json文件

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

我能够使用

动态obj=JsonConvert.DeserializeObjectjson

它似乎是一个嵌套的对象结构

我需要绘制json文件中的每个变量,但是json文件结构经常变化

有没有一种方法可以使用嵌套的foreach语句来解析这个结构? 如果不是,我可以通过像字典一样的字符串访问每个元素来解析它吗

例如:

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,那么您可以轻松获得所有属性