【发布时间】:2018-05-14 04:37:06
【问题描述】:
我有一个格式如下的 json 文件:
{
"HDRDTL":["SRNO","STK_IDN","CERTIMG"],
"PKTDTL":[
{"SRNO":"2814","STK_IDN":"1001101259","CERTIMG":"6262941723"},
{"SRNO":"2815","STK_IDN":"1001101269","CERTIMG":"6262941726"},
{"SRNO":"2816","STK_IDN":"1001101279","CERTIMG":"6262941729"}
],
"IMGTTL":
["CERTIMG","ARRIMG"],
"IMGDTL":{"CERTIMG":"CRd6z2uq3gvx7kk","ARRIMG":"ASd6z2uq3gvx7kk"}
}
“PKTDTL”数组是我需要转换为 csv 的部分。 如何在 C# 中实现这一点?
注意,例如,我在“PKTDTL”中只有3个项目,真正的json文件有数千行({“SRNO” ...})并且很大。
我编写了以下不起作用的代码。请参阅代码中注释的错误消息。
问题
- 有人知道为什么失败吗?
-
你有更好/替代的方法
public static void ConvertJsonToCSV(string InFile) { string OutFile=InFile.Replace("json","csv"); StreamReader sInFile = new StreamReader(InFile); StreamWriter sOutFile = new StreamWriter(OutFile); using (sInFile) { string sJson = sInFile.ReadToEnd(); //************************************************************* // the below line failed, error message: unexpected json token // when reading datatable, expected startArray, got StartObject. //************************************************************** DataTable dt = JsonConvert.DeserializeObject<DataTable>(sJson); //DataTable dt = JsonConvert.DeserializeAnonymousType(sJson, new { Makes = default(DataTable) }).Makes; var sb = new StringBuilder(); string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); sb.AppendLine(string.Join(",", columnNames)); foreach (DataRow dr in dt.Rows) { foreach (object field in dr.ItemArray) { sb.Append(field.ToString().Replace(",", "") + ","); } sb.Replace(",", "\n", sb.Length - 1, 1); } sOutFile.Write(sb.ToString()); sOutFile.Close(); sInFile.Close(); }}
【问题讨论】:
-
判断您是否提出问题的一个重要线索是您是否使用 ? .这看起来你只需要使用调试器。
-
你说不行。它有什么作用?
-
Keith:我知道错误在哪里。它位于“DataTable dt = JsonConvert.DeserializeObject
(sJson);”这一行它说:读取 DataTable 时出现意外的 Json 令牌。预期 StartArray,得到 StartObject... -
你确定 JSON 是正确的吗?因为这里说不正确:jsonformatter.curiousconcept.com
-
Federico 是对的,前两个
}后面少了两个逗号,虽然这里可能只是复制粘贴错误。