Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换嵌套JSON字典<;字符串,JValue>;excel工作表c#_C#_Excel_Dictionary_Nested_Json.net - Fatal编程技术网

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

转换嵌套JSON字典<;字符串,JValue>;excel工作表c#,c#,excel,dictionary,nested,json.net,C#,Excel,Dictionary,Nested,Json.net,将嵌套JSON字典转换为excel工作表 我处理的json字符串有x个级别,每次它们都是不同的json字符串 Json string: [{ "nombreId":1016, "nombre":John, "proyectos":[ {"proyectoId":1,"nombre":ProyectoEmpleados}, {"proyectoId":20,&qu

将嵌套JSON字典转换为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字符串解析为字典,如下所示:

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;
}
        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]} 

有什么想法吗?

IMHO,最好使用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; }
}
void Main()
{
var people=JsonConvert.DeserializeObject(json);
ExcelPackage pck=新的ExcelPackage();
var ws=pck.Workbook.Worksheets.Add(“MyWs”);
var-proyectos=0;
for(int i=0;i
使用JsonConvert的Newtonsoft JSON可能会更容易做到这一点。您是否可以共享示例JSON。如果要将
JToken
转换为
字典,其中键是路径,值是原语值,请参阅。您正在使用
Dictionary
,但可能需要在某个时候转换为
JValue.Value
。但是,你能把你的问题分享给大家吗?现在还不清楚,将JSON结构化为
字典
是否正确,以便输出到Excel。您问题中包含的JSON似乎格式不正确。将其上载到,您将得到错误,例如第3行的
Error:Parse Error:应为'STRING','NUMBER','NULL','TRUE','FALSE','{','[”,得到“未定义”
。似乎有很多值没有正确引用。请共享格式良好的JSON以演示您的问题。另外,您当前如何输出到Excel?是否正在写入CSV?
Microsoft.Office.Interop.Excel
OleDb
?其他内容?中显示了一系列选项例如,感谢Avaved。我不能使用类,因为我可以使用不同的json。json是random@ararb78,你可以。拥有随机json并不重要。你在代码中有这个想法。
    NombreId    Nombre  ProyectoId  Nombre
    1016        John    1016        ProyectoEmpleados       
                        20          ProyectoNominas
    1056        Sara    22          ProyectoContabilidad
                        20          ProyectoNominas
        
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; }
}