【发布时间】:2020-04-18 12:33:15
【问题描述】:
输入json是(json是真实数据的一小部分,真实json很长而且层次比较多。json行30k多)
{
"data": {
"getUsers": [
{
"userProfileDetail": {
"userStatus": {
"name": "Expired"
},
"userStatusDate": "2017-04-04T07:48:25+00:00",
"lastAttestationDate": "2019-02-01T03:50:42.6049634-05:00"
},
"userInformation": {
"Id": 13610875,
"lastName": "************",
"suffix": null,
"gender": "FEMALE",
"birthDate": "1970-01-01T00:01:00+00:00",
"ssn": "000000000",
"ethnicity": "INVALID_REFERENCE_VALUE",
"languagesSpoken": null,
"personalEmail": null,
"otherNames": null,
"userType": {
"name": "APN"
},
"primaryuserState": "CO",
"otheruserState": [
"CO"
],
"practiceSetting": "INPATIENT_ONLY",
"primaryEmail": "*****@*****.com"
}
},
{
"userProfileDetail": {
"userStatus": {
"name": "Expired newwwwwwwwwwww"
},
"userStatusDate": "2017-04-04T07:48:25+00:00",
"lastAttestationDate": "2019-02-01T03:50:42.6049634-05:00"
},
"userInformation": {
"Id": 13610875,
"lastName": "************",
"suffix": null,
"gender": "FEMALE",
"birthDate": "1970-01-01T00:01:00+00:00",
"ssn": "000000000",
"ethnicity": "INVALID_REFERENCE_VALUE",
"languagesSpoken": null,
"personalEmail": null,
"otherNames": null,
"userType": {
"name": "APN"
},
"primaryuserState": "CO",
"otheruserState": [
"CO"
],
"practiceSetting": "INPATIENT_ONLY",
"primaryEmail": "*****@*****.com"
}
}
]
}
}
代码是
var obj = JObject.Parse(json);
// Collect column titles: all property names whose values are of type JValue, distinct, in order of encountering them.
var jsonValues = obj.DescendantsAndSelf().OfType<JProperty>().Where(p => p.Value is JValue).GroupBy(p => p.Name).ToList();
var jsonKey = jsonValues.Select(g => g.Key).ToArray();
// Filter JObjects that have child objects that have values.
var parentsWithChildren = jsonValues.SelectMany(g => g).SelectMany(v => v.AncestorsAndSelf().OfType<JObject>().Skip(1)).ToHashSet();
// Collect all data rows: for every object, go through the column titles and get the value of that property in the closest ancestor or self that has a value of that name.
var rows = obj
.DescendantsAndSelf()
.OfType<JObject>()
.Where(o => o.PropertyValues().OfType<JValue>().Any() && (o == obj || !parentsWithChildren.Contains(o))) // Show a row for the root object + objects that have no children.
.Select(o => jsonKey.Select(c => o.AncestorsAndSelf().OfType<JObject>().Select(parent => parent[c])
.Where(v => v is JValue).Select(v => (string)v).FirstOrDefault()).Reverse() // Trim trailing nulls
.SkipWhile(s => s == null).Reverse());
// Convert to CSV
var csvRows = new[] { jsonKey }.Concat(rows).Select(r => string.Join(",", r));
var csv = string.Join("\n", csvRows);
Console.WriteLine(csv);
这是我得到的输出:
getUsers_userProfileDetail_userStatus_name,getUsers_userProfileDetail_userStatusDate,getUsers_userProfileDetail_lastAttestationDate,getUsers_userInformation_Id,getUsers_userInformation_lastName,getUsers_userInformation_suffix,getUsers_userInformation_gender,getUsers_userInformation_birthDate,getUsers_userInformation_ssn,getUsers_userInformation_ethnicity,getUsers_userInformation_languagesSpoken,getUsers_userInformation_personalEmail,getUsers_userInformation_otherNames,getUsers_userInformation_userType_name,getUsers_userInformation_primaryuserState,getUsers_userInformation_otheruserState,getUsers_userInformation_practiceSetting,getUsers_userInformation_primaryEmail 已过期,04/04/2017 13:18:25,02/01/2019 14:20:42 APN,,,13610875,************,,FEMALE,01/01/1970 05:31:00,000000000,INVALID_REFERENCE_VALUE,,,,CO,INPATIENT_ONLY,*****@ *****.com
这里的 userType > name not column 不在正确的位置,otheruserState 数组没有出现在输出中。
谁能帮帮我?
【问题讨论】:
-
也许有一些 LINQ 功夫可以挖掘那些嵌套项目以获得您的结果,但是将 json 反序列化为强类型并将转换器编码为 csv 不是更容易吗?
-
基于此 JSON 创建一个类并将 JSON 转换为类并使用其属性
-
您需要在花括号之后,但在 getUsers 的右方括号之前使用逗号吗?不确定...