代码之家  ›  专栏  ›  技术社区  ›  ararb78

将嵌套JSON字典<string,JValue>转换为excel工作表c#

  •  -1
  • ararb78  · 技术社区  · 5 年前

    转换嵌套JSON字典<字符串,JValue>excel工作表

    我处理的json字符串有x个级别,每次它们都是不同的json字符串。

    Json string:
    [{
    "nombreId":1016,
    "nombre":John,
    "proyectos":[
        {"proyectoId":1,"nombre":ProyectoEmpleados},
        {"proyectoId":20,"nombre":ProyectoNominas},
        ],
    "nombreId":1056,
    "nombre":Sara,
    "proyectos":[
        {"proyectoId":22,"nombre":ProyectoContabilidad},
        {"proyectoId":nombre,"nombre":ProyectoNominas},
        ]
    }]
    

    我已将嵌套的json字符串解析为Dictionary<字符串,JValue>这样地:

    public class JsonColeccionCampo
    {
        private readonly Dictionary<string, JValue> campos;
        public JsonColeccionCampo(JToken token)
        {
            campos = new Dictionary<string, JValue>();
            ObtenerCampos(token);            
        }       
        
        private void ObtenerCampos(JToken jToken)
        {
            switch (jToken.Type)
            {
                case JTokenType.Object:
                    foreach (var child in jToken.Children<JProperty>())
                        ObtenerCampos(child);
                    break;
                case JTokenType.Array:
                    foreach (var child in jToken.Children())
                       ObtenerCampos(child);
                    break;
                case JTokenType.Property:
                    ObtenerCampos(((JProperty)jToken).Value);
                    break;
                default:
                    //forma campos:
                    campos.Add(jToken.Path, (JValue)jToken);                 
                    break;
            }
        }
        public Dictionary<string, JValue> GetAllCampos() => campos;
    }
    

    //电话:

    private Dictionary<string, JValue> obtenerCamposApartirdeJson(string parametroJson)
    {
    
        Dictionary<string, JValue> estructuraLista = null;
        if (!string.IsNullOrEmpty(parametroJson))
        {
            var json = JToken.Parse(parametroJson);
            var fieldsCollector = new Comun.JsonColeccionCampo(json);
            estructuraLista = fieldsCollector.GetAllCampos();
        }
        return estructuraLista;
    }
    

    //我有一个列表“Estrestructuralista”或类型字典<字符串,JValue>这样地:

            filas   Count = 11  System.Collections.Generic.Dictionary<string, Newtonsoft.Json.Linq.JValue>
            [0] {[[0].nombreId, 1016]}  System.Collections.Generic.KeyValuePair<string, Newtonsoft.Json.Linq.JValue>
            [1] {[[0].nombre, John]}    
            [2] {[[0].proyecto[0].proyectoId, 1]}   
            [3] {[[0].proyecto[0].Nombre, ProyectoEmpleados]}   
            [4] {[[0].proyecto[1].proyectoId, 20]}  
            [5] {[[0].proyecto[1].Nombre, ProyectoNominas]}
            [6] {[[1].nombreId, 1056]}  
            [7] {[[1].nombre, Sara]}    
            [8] {[[1].proyecto[0].proyectoId, 22]}  
            [9]{[[1].proyecto[0].Nombre, ProyectoContabilidad]} 
            [10]{[[1].proyecto[1].proyectoId, 20]}
            [11]{[[1].proyecto[1].Nombre, ProyectoNominas]} 
    

        NombreId    Nombre  ProyectoId  Nombre
        1016        John    1016        ProyectoEmpleados       
                            20          ProyectoNominas
        1056        Sara    22          ProyectoContabilidad
                            20          ProyectoNominas
            
    

    有什么想法吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Cetin Basoz    5 年前

    恕我直言,最好使用Nuget的Newtonsoft.Json和Epplus库来实现这一点。即:

    void Main()
    {
        var people = JsonConvert.DeserializeObject<Item[]>(json);
        ExcelPackage pck = new ExcelPackage();
        var ws = pck.Workbook.Worksheets.Add("MyWs");
        
        var proyectos = 0;
        for (int i = 0; i < people.Length; i++)
        {
            ws.Cells[$"A{proyectos + 1}"].Value = people[i].NombreId;
            ws.Cells[$"B{proyectos + 1}"].Value = people[i].Nombre;
            ws.Cells[$"C{proyectos + 1}"].LoadFromCollection(people[i].Proyectos,false);
            proyectos += people[i].Proyectos.Length;
        }
        ws.Cells[ws.Dimension.Address].AutoFitColumns();
    
    
        var fi = new FileInfo(@"c:\temp\MySample.xlsx");
        if (fi.Exists)
        {
            fi.Delete();
        }
        pck.SaveAs(fi);
    }
    
    string json = @"[
    {
     ""nombreId"":1016,
     ""nombre"":""John"",
     ""proyectos"":[
         {""proyectoId"":1,""nombre"":""ProyectoEmpleados""},
         {""proyectoId"":20,""nombre"":""ProyectoNominas""} ]
    },
    {
    ""nombreId"":1056,
    ""nombre"":""Sara"",
    ""proyectos"":[
         {""proyectoId"":22,""nombre"":""ProyectoContabilidad""},
         {""proyectoId"":23,""nombre"":""ProyectoNominas""}
         ]
    }]";
    
    public class Item
    {
        [JsonProperty("nombreId")]
        public int NombreId { get; set; }
    
        [JsonProperty("nombre")]
        public string Nombre { get; set; }
    
        [JsonProperty("proyectos")]
        public Proyecto[] Proyectos { get; set; }
    }
    
    public partial class Proyecto
    {
        [JsonProperty("proyectoId")]
        public int ProyectoId { get; set; }
    
        [JsonProperty("nombre")]
        public string Nombre { get; set; }
    }