从结构化数据构建 JSON 层次结构



C# | .NET 4.5 |实体框架 5

我有来自 SQL 查询的数据以 ID、父 ID、名称的形式返回。我想获取该数据并将其解析为分层 JSON 字符串。到目前为止,这似乎是一项艰巨的任务,而不是应该的。由于我使用的是实体,因此数据作为IEnumerable很好地返回给我。现在我相信我只需要某种形式的递归,但我不太确定从哪里开始。任何帮助,不胜感激。

数据返回为

id 父 ID 名称1 1 顶禄2 1 Loc13 1 Loc24 2 Loc1A

代码是

public static string GetJsonLocationHierarchy(long locationID)
{
    using (EntitiesSettings context = new EntitiesSettings())
    {
        // IEnumerable of ID,ParentID,Name
        context.GetLocationHierarchy(locationID);
    }
}

我希望最终结果是这样的:

{
    "id": "1",
    "parentId": "1",
    "name": "TopLoc",
    "children": [
        {
            "id": "2",
            "parentId": "1",
            "name": "Loc1",
            "children": [
                {
                    "id": "4",
                    "parentId": "2",
                    "name": "Loc1A",
                    "children": [
                        {}
                    ]
                }
            ]
        },
        {
            "id": "3",
            "parentId": "1",
            "name": "Loc2",
            "children": [
                {}
            ]
        }
    ]
}

将平面表转换为层次结构的一种方法是将所有节点放入字典中。 然后遍历字典,对于每个节点,查找其父节点并将其添加到父节点的子节点。 从那里,你只需要找到根并序列化它。

下面是演示该方法的示例程序:

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<Location> locations = new List<Location>
        {
            new Location { Id = 1, ParentId = 1, Name = "TopLoc" },
            new Location { Id = 2, ParentId = 1, Name = "Loc1" },
            new Location { Id = 3, ParentId = 1, Name = "Loc2" },
            new Location { Id = 4, ParentId = 2, Name = "Loc1A" },
        };
        Dictionary<int, Location> dict = locations.ToDictionary(loc => loc.Id);
        foreach (Location loc in dict.Values)
        {
            if (loc.ParentId != loc.Id)
            {
                Location parent = dict[loc.ParentId];
                parent.Children.Add(loc);
            }
        }
        Location root = dict.Values.First(loc => loc.ParentId == loc.Id);
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Formatting.Indented
        };
        string json = JsonConvert.SerializeObject(root, settings);
        Console.WriteLine(json);
    }
}
class Location
{
    public Location()
    {
        Children = new List<Location>();
    }
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Name { get; set; }
    public List<Location> Children { get; set; }
}

这是输出:

{
  "id": 1,
  "parentId": 1,
  "name": "TopLoc",
  "children": [
    {
      "id": 2,
      "parentId": 1,
      "name": "Loc1",
      "children": [
        {
          "id": 4,
          "parentId": 2,
          "name": "Loc1A",
          "children": []
        }
      ]
    },
    {
      "id": 3,
      "parentId": 1,
      "name": "Loc2",
      "children": []
    }
  ]
}

相关内容

  • 没有找到相关文章