如何在对象结构未知的情况下反序列化JSON对象

费加尔

我的部分代码将机器的文件路径以以下格式序列化为JSON。我正在努力使用此JSON并将文件路径重新放回原处。我正在使用Newtonsoft JSON库;我发现它非常适合构建JSON。如您所见,我的JSON具有嵌套对象。

我有的JSON:

{
  ".": {
    "proc": {
      "15": {
        "task": {
          "15": {
            "exe": {},
            "mounts": {
              "list_of_files": [
                "mounts.xml"
              ]
            },
            "mountinfo": {
              "list_of_files": [
                "mountinfo.xml"
              ]
            },
            "clear_refs": {
              "list_of_files": [
                "clear_ref.xml"
              ]
            }
          }
        }
      },
      "14": {
        "loginuid": {
          "list_of_files": [
            "loginuid.xml"
          ]
        },
        "sessionid": {
          "list_of_files": [
            "sessionid.xml"
          ]
        },
        "coredump_filter": {
          "list_of_files": [
            "coredump_filter.xml"
          ]
        },
        "io": {
          "list_of_files": [
            "io.xml"
          ]
        }
      }
    }
  }
}

我要从中生成的数组。

string[] dirArray = {
"./proc/15/task/15/exe",
"./proc/15/task/15/mounts/mounts.xml",
"./proc/15/task/15/mountinfo/mountinfo.xml",
"./proc/15/task/15/clear_refs/clear_ref.xml",
"./proc/14/loginuid/loginuid.xml",
"./proc/14/sessionid/sessionid.xml",
"./proc/14/coredump_filter/coredump_filter.xml",
"./proc/14/io/io.xml"
}

到目前为止,我的工作-我将JSON反序列化为动态变量,但不确定如何处理两个问题:

  1. 我的JSON格式未知,我不知道对象的深度,如何处理?
  2. 在运行时定义动态变量时,如何使用它们?

编辑

对不起,我原来的JSON格式是错误的,所以它不会与工作答案由user12864提供。我收到一个错误:Unable to cast object of type 'Newtonsoft.Json.Linq.JArray' to type 'Newtonsoft.Json.Linq.JObject'.

这是一个小提琴,显示了我到目前为止所处的位置。

布赖恩·罗杰斯

@ user12864的答案是正确的,但是需要对代码进行调整,以说明每个目录可以具有文件数组而不是单个“文件”对象的事实(您本来应该在问题中最初提到过) 。这是处理此问题的更新方法:

private static void AddToFileList(JObject jo, List<string> list, string prefix)
{
    foreach (var kvp in jo)
    {
        if (kvp.Key == "list_of_files")
        {
            foreach (string name in (JArray)kvp.Value)
            {
                list.Add(prefix + name);
            }
        }
        else
        {
            JObject dir = (JObject)kvp.Value;
            if (dir.Count == 0)
            {
                list.Add(prefix + kvp.Key);
            }
            else
            {
                AddToFileList(dir, list, prefix + kvp.Key + "/");
            }
        }
    }
}

完整演示:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
          ""."": {
            ""proc"": {
              ""15"": {
                ""task"": {
                  ""15"": {
                    ""exe"": {},
                    ""mounts"": {
                      ""list_of_files"": [
                        ""mounts.xml""
                      ]
                    },
                    ""mountinfo"": {
                      ""list_of_files"": [
                        ""mountinfo.xml""
                      ]
                    },
                    ""clear_refs"": {
                      ""list_of_files"": [
                        ""clear_ref.xml""
                      ]
                    }
                  }
                }
              },
              ""14"": {
                ""loginuid"": {
                  ""list_of_files"": [
                    ""loginuid.xml""
                  ]
                },
                ""sessionid"": {
                  ""list_of_files"": [
                    ""sessionid.xml""
                  ]
                },
                ""coredump_filter"": {
                  ""list_of_files"": [
                    ""coredump_filter.xml""
                  ]
                },
                ""io"": {
                  ""list_of_files"": [
                    ""io.xml""
                  ]
                }
              }
            }
          }
        }";

        JObject jo = JObject.Parse(json);
        foreach (string path in CreateFileList(jo))
        {
            Console.WriteLine(path);
        }
    }

    private static List<string> CreateFileList(JObject jo)
    {
        List<string> ret = new List<string>();
        AddToFileList(jo, ret, "");
        return ret;
    }

    private static void AddToFileList(JObject jo, List<string> list, string prefix)
    {
        foreach (var kvp in jo)
        {
            if (kvp.Key == "list_of_files")
            {
                foreach (string name in (JArray)kvp.Value)
                {
                    list.Add(prefix + name);
                }
            }
            else
            {
                JObject dir = (JObject)kvp.Value;
                if (dir.Count == 0)
                {
                    list.Add(prefix + kvp.Key);
                }
                else
                {
                    AddToFileList(dir, list, prefix + kvp.Key + "/");
                }
            }
        }
    }
}

输出:

./proc/15/task/15/exe
./proc/15/task/15/mounts/mounts.xml
./proc/15/task/15/mountinfo/mountinfo.xml
./proc/15/task/15/clear_refs/clear_ref.xml
./proc/14/loginuid/loginuid.xml
./proc/14/sessionid/sessionid.xml
./proc/14/coredump_filter/coredump_filter.xml
./proc/14/io/io.xml

小提琴:https : //dotnetfiddle.net/r8CkI2

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在字符串值包装在同名对象中的情况下彻底反序列化JSON

来自分类Dev

如何在字符串值包装在同名对象中的情况下彻底反序列化JSON

来自分类Dev

如何在不获得反序列化最新信息的情况下序列化对象的几个帧?

来自分类Dev

如何在没有任何数据损坏风险的情况下序列化对象?

来自分类Dev

如何在不使用序列化的情况下制作Java对象的深层副本?

来自分类Dev

如何在不丢失“连接”的情况下序列化Atom api对象

来自分类Dev

如何反序列化Json对象?

来自分类Dev

如何反序列化 JSON 对象?

来自分类Dev

如何在不包括属性名称的情况下将匿名对象序列化为JSON

来自分类Dev

如何在不使用对象的情况下序列化为JSON

来自分类Dev

如何在不丢失其特定属性的情况下将子实例反序列化为父对象?

来自分类Dev

当对象数量未知时,反序列化Json

来自分类Dev

使用未知对象名称反序列化JSON

来自分类常见问题

JSON.net:如何在不使用默认构造函数的情况下反序列化?

来自分类Dev

如何在不丢失任何值的情况下反序列化具有重复键的JSON?

来自分类Dev

如何在不需要包装器类型的情况下反序列化 JSON 数组?

来自分类Dev

当对象类型事先未知时,如何反序列化JSON?

来自分类Dev

如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

来自分类Dev

如何使用.net支持对象序列化和反序列化以更改类结构?

来自分类Dev

如何使用XStream序列化/反序列化类型层次结构中的对象?

来自分类Dev

使用DataContractSerializer在对象中反序列化XML

来自分类Dev

JMS在对象中反序列化ArrayCollection

来自分类Dev

使用DataContractSerializer在对象中反序列化XML

来自分类Dev

如何在不初始化的情况下声明反序列化的类参数数组?

来自分类Dev

反序列化数组时如何获取对象json

来自分类Dev

如何反序列化无效的json?截断的对象列表

来自分类Dev

如何从反序列化JSON对象获取值?

来自分类Dev

反序列化内部JSON对象

来自分类Dev

JSON转换反序列化对象

Related 相关文章

  1. 1

    如何在字符串值包装在同名对象中的情况下彻底反序列化JSON

  2. 2

    如何在字符串值包装在同名对象中的情况下彻底反序列化JSON

  3. 3

    如何在不获得反序列化最新信息的情况下序列化对象的几个帧?

  4. 4

    如何在没有任何数据损坏风险的情况下序列化对象?

  5. 5

    如何在不使用序列化的情况下制作Java对象的深层副本?

  6. 6

    如何在不丢失“连接”的情况下序列化Atom api对象

  7. 7

    如何反序列化Json对象?

  8. 8

    如何反序列化 JSON 对象?

  9. 9

    如何在不包括属性名称的情况下将匿名对象序列化为JSON

  10. 10

    如何在不使用对象的情况下序列化为JSON

  11. 11

    如何在不丢失其特定属性的情况下将子实例反序列化为父对象?

  12. 12

    当对象数量未知时,反序列化Json

  13. 13

    使用未知对象名称反序列化JSON

  14. 14

    JSON.net:如何在不使用默认构造函数的情况下反序列化?

  15. 15

    如何在不丢失任何值的情况下反序列化具有重复键的JSON?

  16. 16

    如何在不需要包装器类型的情况下反序列化 JSON 数组?

  17. 17

    当对象类型事先未知时,如何反序列化JSON?

  18. 18

    如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

  19. 19

    如何使用.net支持对象序列化和反序列化以更改类结构?

  20. 20

    如何使用XStream序列化/反序列化类型层次结构中的对象?

  21. 21

    使用DataContractSerializer在对象中反序列化XML

  22. 22

    JMS在对象中反序列化ArrayCollection

  23. 23

    使用DataContractSerializer在对象中反序列化XML

  24. 24

    如何在不初始化的情况下声明反序列化的类参数数组?

  25. 25

    反序列化数组时如何获取对象json

  26. 26

    如何反序列化无效的json?截断的对象列表

  27. 27

    如何从反序列化JSON对象获取值?

  28. 28

    反序列化内部JSON对象

  29. 29

    JSON转换反序列化对象

热门标签

归档