중첩 된 JSON에서 API의 일부 데이터를 가져 와서 CSV로 내 보내야합니다. 여러 클래스를 만들지 않고 해당 데이터를 CSV로 내보내는 데 적합한 구문을 찾을 수 없습니다 (수백 개의 속성이 있으며 새 속성을 동적으로 추가 할 수 있음).
API의 JSON 응답 구조는 다음과 같습니다.
{
"data": [
{
"id": "1",
"type": "Bus",
"attributes": {
"property-two": "2020-12-10",
"property-three": "D",
"property-four": null,
"property-five": 5
}
},
{
"id": "2",
"type": "Car",
"attributes": {
"property-two": "2020-12-10",
"property-three": "D",
"property-four": null,
"property-five": 5
}
}
]
}
각 데이터 세트의 "attributes"노드를 CSV로 내보내기 만하면되지만 데이터를 평면화하거나 해당 노드 만 추출하는 것처럼 보이지는 않습니다.
다음 코드는 JToken
개체 목록을 가져 오지만 다시 직렬화 및 역 직렬화하지 않고 CSV로 내보낼 수 있는지 잘 모르겠습니다. 데이터 유형은 열을 추가하고 제거 할 수 있으므로 동적입니다.
var jsonObject = JObject.Parse(apiResponseString);
var items = jsonObject["data"].Children()["attributes"].ToList();
//TODO: Export to CSV, DataTable etc
속성 노드에서만 데이터를 역 직렬화 할 수 있습니까? 그리고 어떻게 수행 할 수 있습니까 ( 초기화에서든 목록을 다시 JObject.Parse
직렬화 하든 JToken
)? 나는에 묶여 있지 않으므로 JObject
Newtonsoft 또는 기타도 사용할 수 있습니다.
Json.Net의 LINQ-to-JSON API (JObjects) 를 사용하여 아래와 같이 JSON 데이터를 CSV로 변환 할 수 있습니다.
먼저 몇 가지 짧은 확장 메서드를 정의합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
public static class JsonHelper
{
public static string ToCsv(this IEnumerable<JObject> items, bool includeHeaders = true)
{
if (!items.Any()) return string.Empty;
var rows = new List<string>();
if (includeHeaders)
{
rows.Add(items.First().Properties().Select(p => p.Name).ToCsv());
}
rows.AddRange(items.Select(jo =>
jo.Properties().Select(p => p.Value.Type == JTokenType.Null ? null : p.Value).ToCsv()
));
return string.Join(Environment.NewLine, rows);
}
public static string ToCsv(this IEnumerable<object> values)
{
const string quote = "\"";
const string doubleQuote = "\"\"";
return string.Join(",", values.Select(v =>
v != null ? string.Concat(quote, v.ToString().Replace(quote, doubleQuote), quote) : string.Empty
));
}
}
그런 다음 다음을 수행 할 수 있습니다.
var obj = JObject.Parse(json);
var csv = obj.SelectTokens("..attributes").Cast<JObject>().ToCsv();
다음은 작동하는 데모입니다. https://dotnetfiddle.net/NF2G2l
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다