【问题标题】: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


【解决方案1】:

是的,有一个用于动态查询的 API。 请参阅此处的文档:https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

代码如下所示:

JObject rss = JObject.Parse(json); 
var postTitles =
    from p in rss["channel"]["item"]
    select (string)p["title"];

【讨论】:

    【解决方案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);
                        }
                    }
                }
            }           
        }
    

    【讨论】:

    • 您不应该依靠反思或动力来完成您想做的事情。这有点像用核弹敲钉子。每个 jtoken 上都有一个类型,指示它是数组、原子(值)还是数组。您可以使用它来迭代所有孩子。您可以查询 jtoken 以查看您是否有 name 属性而不是添加反射。如果 JToken 恰好是 JObject,您可以轻松获取所有属性 newtonsoft.com/json/help/html/JObjectProperties.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    相关资源
    最近更新 更多