首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中用Json.net解析未知的Json文件

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

Stack Overflow用户
提问于 2019-08-28 03:46:56
回答 2查看 1.4K关注 0票数 0

我可以使用以下命令获得一个动态Json对象

dynamic obj = JsonConvert.DeserializeObject(json);

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

我需要为json文件中的每个变量绘制图形,但是json文件结构经常更改。

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

例如,如下所示:

代码语言:javascript
运行
复制
if(obj["Item1"]["Parameter3"]["Value2"]` != NULL)
   int number = obj["Item1"]["Parameter3"]["Value2"]`

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2019-08-28 03:53:35

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

代码看起来像这样:

代码语言:javascript
运行
复制
JObject rss = JObject.Parse(json); 
var postTitles =
    from p in rss["channel"]["item"]
    select (string)p["title"];
票数 1
EN

Stack Overflow用户

发布于 2019-08-28 05:36:27

最终弄清楚了这个api

一些JToken条目具有值列表,其他条目具有名称和值。在解析它之前,您必须对哪个是哪个进行排序。

这将为Json文件中的每个条目创建一个字典

代码语言:javascript
运行
复制
    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);
                    }
                }
            }
        }           
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57681326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档