转换嵌套JSON字典<;字符串,JValue>;excel工作表c#
将嵌套JSON字典转换为excel工作表 我处理的json字符串有x个级别,每次它们都是不同的json字符串转换嵌套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 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; }
}