{
"build": 44396,
"files": ["00005DC8F14C92FFA13E7FDF1C9C35E4684F8B7A", [
["file1.zip", 462485959, 462485959, 2, 0, 883, true, 266716, 1734, 992, 558, 0],
["file1.doc", 521042, 521042, 2, 0, 883, true, 266716, 1734, 992, 558, 0]
], "0001194B90612DFB5E8D363249719FB62E221430", [
["file2.iso", 501163544, 501163544, 2, 0, 956, true, 194777, 2573, 0, 0, 0]
], "0002B5245B0897BEA7D7F426E104B6D24FF368DE", [
["file3.mp4", 284564707, 284564707, 2, 0, 543, true, 205165, 1387, 853, 480, 0]
]]
}我想把上面的json压平成ID,fileName,fileSize IE
00005DC8F14C92FFA13E7FDF1C9C35E4684F8B7A file1.zip 462485959
00005DC8F14C92FFA13E7FDF1C9C35E4684F8B7A file1.doc 521042
0001194B90612DFB5E8D363249719FB62E221430 file2.iso 501163544
0002B5245B0897BEA7D7F426E104B6D24FF368DE file3.mp4 284564707正如您所看到的,大多数属性都没有名称。文件数组还将id替换为file对象。
我尝试使用类,但得到了错误:“不能反序列化当前的JSON数组{”不能反序列化当前的JSON数组(例如,1,2,3)为类型'Rename.frmMain+jsonFiles‘,因为类型需要一个JSON对象(例如,{\"name\":\"value\"})才能正确反序列化。要修复此错误,要么将JSON更改为JSON对象(例如{\"name\":\"value\"}),要么将反序列化类型更改为数组,或者将实现集合接口(例如ICollection、IList)的类型改为可以从JSON数组反序列化的列表。JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。\r\nPath‘file’,第1行,位置25“} Newtonsoft.Json.JsonSerializationException。
public class jsonDetails
{
public int build { get; set; }
public object files { get; set; }
}
public class jsonFiles
{
public string hash { get; set; }
public string[][] files { get; set; }
}我尝试过使用ExpandoObjects而没有运气。
我看过linq到JSon。
我在网上看到的大多数例子都需要属性名。
我们如何将上述JSON扁平化?
任何帮助都将不胜感激。
发布于 2018-05-16 11:35:00
您可以使用“无模式”直接使用JObject,然后使用一些LINQ来解决问题:
var jsonStr = @"{
""build"": 44396,
""files"": [""00005DC8F14C92FFA13E7FDF1C9C35E4684F8B7A"", [
[""file1.zip"", 462485959, 462485959, 2, 0, 883, true, 266716, 1734, 992, 558, 0],
[""file1.doc"", 521042, 521042, 2, 0, 883, true, 266716, 1734, 992, 558, 0]
], ""0001194B90612DFB5E8D363249719FB62E221430"", [
[""file2.iso"", 501163544, 501163544, 2, 0, 956, true, 194777, 2573, 0, 0, 0]
], ""0002B5245B0897BEA7D7F426E104B6D24FF368DE"", [
[""file3.mp4"", 284564707, 284564707, 2, 0, 543, true, 205165, 1387, 853, 480, 0]
]]
}";
var json = JObject.Parse(jsonStr);
var filesArr = json["files"];
var result = filesArr
.Select((a, i) => new { a, i })
.GroupBy(x => x.i / 2)
.Select(g => g.ToList())
.Select(g => new { id = g[0].a, vals = g[1].a })
.SelectMany(x => x.vals.Select(v => new { x.id, val = v }))
.Select(x => new { id = x.id.Value<string>(),
filename = x.val[0].Value<string>(),
size = x.val[1].Value<long>() });https://stackoverflow.com/questions/50369362
复制相似问题