gpt4 book ai didi

c# - 将字符串数据表示为树

转载 作者:行者123 更新时间:2023-12-03 18:58:55 25 4
gpt4 key购买 nike

我有以下数据。这是我系统上的程序列表。

[
{
"ID": 135,
"CODIGO": 139,
"NOME": "CADASTRO DE ANOS ATIVOS",
"VISAO": "VANOSATIVOSCONTABIL",
"CAMINHO": "Cadastros/Contabilidade/frm_AnosAtivosContabil.aspx, 139, ((VariaveisSistema)Session[VariaveisSistema]).UsuarioId.ToString().Trim(), frm_Visoes.aspx, , Nao"
},
{
"ID": 59,
"CODIGO": 35,
"NOME": "CADASTRO DE CENTRO DE CUSTO",
"VISAO": "VCENTROCUSTO",
"CAMINHO": "Cadastros/Contabilidade/frm_CadastroCentroCusto.aspx, 035, ((VariaveisSistema)Session[VariaveisSistema]).UsuarioId.ToString().Trim(), frm_Visoes.aspx, , Nao"
},
]
所以,你可以看到程序有一个类似 Cadastros/Contabilidade 的路径。 .
我需要转换 Cadastros/Contabilidade在可折叠的菜单树中。
所以json数据应该是这样的:
Cadastros 
|
| Contabilidade
- frm_AnosAtivosContabil.aspx
- frm_CadastroCentroCusto.aspx
- frm_CadastroCFOP.aspx
- ...

| Globais
- frm_AlteraFormacaoArvore.aspx
- frm_AssociacaoCalendario.aspx
- frm_AssociacaoItemTransferencia.aspx
- ...
我正在使用 C#。我设法沿途分离程序(将它们分组)。但我还没有设法将它们分成菜单。
节点结构为:
public class Node
{
public IList<Programa> Programs { get; set; }
public string Name { get; set; }
public string FullName { get; set; }
public Node Parent { get; set; }
public IList<Node> Childrens { get; set; }
}
程序结构:
public class Programa
{
public int Id { get; set; }
public int Codigo { get; set; }
public string Nome { get; set; }
public string Visao { get; set; }
public IList<UsuarioPrograma> UsuariosPrograma { get; set; }
public string Caminho { get; set; }
}
我可以创建根节点。但我不知道如何进行。
private void CreateNode(Programa programa)
{
var paths = programa.Caminho.Split('/');

// Verifica se já é o pai
if (paths.Length == 1)
{
// Verifica se o nó já existe
var node = Menu.FirstOrDefault(x => x.Name == paths[0]);

if (node == null)
{
node = new Node();
node.Name = paths[0];
node.Programs = new List<Programa> { programa };

Menu.Add(node);
}

else Menu.First(x => x.Name == paths[0]).Programs.Add(programa);
}
}

最佳答案

@augusto-henrique 有点棘手,但设法带来了 json 对象,但您希望序列化,看看这段代码,看看这是否适合您的要求,
首先我创建了一个类来序列化你拥有的 JSON

  public class Page
{
public int ID { get; set; }
public int CODIGO { get; set; }
public string NOME { get; set; }
public string VISAO { get; set; }
public string CAMINHO { get; set; }
}
然后我将值分组并作为嵌套集合添加到字典对象中
var json1 = JsonConvert.DeserializeObject<List<Page>>
(File.ReadAllText(@"c:\temp\test1.json"));

var root1 = json1.Select(x => x.CAMINHO)
.Select(x => x.Split(",")[0])
.Select(x => x.Split("/"))
.Select(x => new
{
level1 = x.First(),
level2 = x.Skip(1).First(),
level3 = x.Skip(2).First()
})
.GroupBy(x => new { x.level1, x.level2, x.level3 }, (key, grp) => new
{
Level1 = key.level1,
Level2 = key.level2,
Level3 = key.level3,
groups = grp
});
var jsonObject = new Dictionary<string, object>();
foreach (var level1 in root1)
{
if (!jsonObject.ContainsKey(level1.Level1))
{
jsonObject.Add(level1.Level1, new Dictionary<string, object[]>());
}
if (!((Dictionary<string, object[]>)jsonObject[level1.Level1]).ContainsKey(level1.Level2))
((Dictionary<string, object[]>)jsonObject[level1.Level1]).Add(level1.Level2, new[] { level1.Level3 });
else
{
var list = (((Dictionary<string, object[]>)jsonObject[level1.Level1])[level1.Level2]).ToList();
list.Add(level1.Level3);
((Dictionary<string, object[]>)jsonObject[level1.Level1])[level1.Level2] = list.ToArray();
}

}
var jsonText = JsonConvert.SerializeObject(jsonObject);
jsonText 的结果看起来像,希望你可以进一步开发。,可能需要一些重构,
JSON Document

关于c# - 将字符串数据表示为树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65256435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com