展平没有名称属性的JSON

时间:2018-05-16 11:12:03

标签: c# json

{
    "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与文件对象交替。

我尝试使用类,但得到错误:“无法反序列化当前的JSON数组 {“无法将当前JSON数组(例如[1,2,3])反序列化为类型'Rename.frmMain + jsonFiles',因为该类型需要一个JSON对象(例如{\”name \“:\”value \“})正确地反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{\“name \”:\“value \”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。\ r \ nPath'files',第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?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:5)

您可以直接使用“{schema}”并直接使用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>() });