为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
杨__羊羊 2023-09-24 17:23:11
我可以使用获取动态 Json 对象dynamic obj = JsonConvert.DeserializeObject(json);看起来是一个嵌套的对象结构我需要绘制 json 文件中的每个变量的图表,但 json 文件结构经常发生变化有没有办法使用嵌套的 foreach() 语句来解析这个结构?如果没有,我可以通过像字典一样的字符串访问每个元素来解析它吗?例如:if(obj["Item1"]["Parameter3"]["Value2"]` != NULL)    int number = obj["Item1"]["Parameter3"]["Value2"]`谢谢,
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

是的,有一个用于动态查询的 API。

代码看起来像这样:

JObject rss = JObject.Parse(json); 

var postTitles =

    from p in rss["channel"]["item"]

    select (string)p["title"];


查看完整回答
反对 回复 2023-09-24
?
POPMUISE

TA贡献1765条经验 获得超5个赞

终于搞清楚这个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);

                    }

                }

            }

        }           

    }


查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 237 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信