c# - 分层 JSON 数据到分层表

标签 c# sql json.net

我有一个这样的类,对于这种类型,我需要反序列化一个 JSON 字符串

public class nodes
{
    public int id{get;set;}
    public string name{get;set;}
    public List<nodes> children{get;set;}
}

JSON 是这样的

{
  id: 15,
  name: 'user1',
  children: [
    {
      id: 22,
      name: 'user2',
      children: [
        {
          id: 34,
          name: 'user3',
          children: [
            {
              id: 43,
              name: 'user4',
              children: []
            },
            {
              id: 54,
              name: 'user5',
              children: []
            }
          ]
        },
        {
          id: 65,
          name: 'user6',
          children: []
        }
      ]
    },
    {
      id: 72,
      name: 'user7',
      children: []
    }
  ]
}

这就是我反序列化的方式

node d=JsonConvert.DeserializeObject<node>(myJSON); //myJSON is my above JSON string

但要求是我需要将这些数据作为单独的行插入到 SQL 表中。表格应该如下所示

UniqueID    id    name    ParentID
------------------------------------
    1       15    User1     0
    2       22    User2     1
    3       34    User3     2
    4       43    User4     3
    5       54    User5     3
    6       65    User6     2
    7       72    User7     1
--------------------------------------

如您所见,表中有一个系统生成的 ID 列 UniqueID。还有另一列 ParentID 来保持层次结构..

我当然可以使用一些递归函数来处理每个 child 的详细信息,并创建一个动态查询来插入。但我认为这不是最佳解决方案。请提出一个更好的方法来做到这一点

最佳答案

如何通过 Linq 展平你的树(它仍然会使用递归),我认为它可能会更清楚。然后你可以循环遍历结果。我在想这样的事情:

先写一个扩展方法:

public static IEnumerable<T> Flatten<T>(
    this IEnumerable<T> c,
    Func<T,IEnumerable<T>> f) 
{
    return c.SelectMany(n => f(n).Flatten(f)).Concat(c);
}

然后你可以展平和循环:

var nodesList = nodes.Flatten(node => node.children).ToList();

foreach(var n in nodeList)
{
    /add to db
}

关于c# - 分层 JSON 数据到分层表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507341/

相关文章:

C# 将不同版本的程序集加载到同一个项目

SQL 执行返回的结果与直接在 MS SQL Server Management Studio 中执行不同

c# - 如何在 C# 中使用 Newtonsoft.json 解析具有不同名称的 JSON 子节点列表

c# - 我希望 Json.NET 无法反序列化缺失或未定义的值类型

c# - NewtonSoft.Json 自定义 JsonConverter 反序列化到 DateTime 不工作

c# - Windows Phone 8 HttpClient Get 方法返回奇怪的结果

c# - 我可以使用 MVC 3 在 C# 中使用 Active Directory 进行身份验证吗?

c# - 如何从 C# 调用 Java 代码?

sql - MySQL 将行转为类似记录的列

sql - 如何获取 30 天内的下一个最小日期并用作 SQL 中的引用点?