2016-08-27 3 views
0

나는 실행JSON 객체

[ 
    { 
    "name": "Field1", 
    "results": [ 
     "One", 
     "Two", 
     "Three" 
    ] 
    }, 
    { 
    "name": "Field2", 
    "results": [ 
     "One", 
     "Two", 
     "Three", 
     "Four" 
    ] 
    } 
] 

후 출력 아래에서 결과 다음과 같은 C# 클래스

public class Output 
     { 
      public string name { get; set; } 
      public string[] results { get; set; } 
     } 

는 DataTable을로 내 JSON 변환 할 수있는 유틸리티 나 라이브러리가 있나요했습니다 . 나는 JSON.net example하지만

string json = @"[{"Field1" : "One", "Field2": "One"} 
{"Field1" : "Two", "Field2": "Two"} 
{"Field1" : "Three", "Field2": "Three"} 
{"Field1" : "", "Field2": "Four"}]; 

var table = JsonConvert.DeserializeObject<DataTable>(json); 

또한 테이블에 그 변환의 형식 아래에 있어야 JSON을 요구, 내 JSON이 형식으로 변환 될 수 있으면 모든 단서가 JsonConvert.DeserializeObject

에 대한

을 그것은하지의 요구 확인 중복으로 표시된 질문은 여기에 제공된 복잡한 JSON 형식 예제 대신 최상의 방법을 설명합니다.

예상 출력

Field1, Field2 
One, One 
Two, Two 
Three, Three 
null,Four 
+0

어떻게이 JSON을 만드십니까? – STORM

+0

html 파일의 일부 데이터를 구문 분석하여 –

+0

DataTable에 어떤 구조가 있어야합니까? 귀하의 예제에서 나는 당신이 2 열을 원하는 결론 : Field1 & Field2, 맞습니까? –

답변

2

JsonConver.DeserializeObject은 목표를 달성하기위한 쉬운 방법을 제공하지 않습니다. Output s의 목록에서 간단한 파서를 DataTable에 작성하는 것이 훨씬 쉽습니다. 나는 코드를 제공 :

public static class Helper 
{ 
    public static DataTable ToDataTable(this List<Program.Output> list) 
    { 
     var dt = new DataTable(); 

     // insert enough amount of rows 
     var numRows = list.Select(x => x.results.Length).Max(); 
     for (int i = 0; i < numRows; i++) 
      dt.Rows.Add(dt.NewRow()); 

     // process the data 
     foreach (var field in list) 
     { 
      dt.Columns.Add(field.name); 
      for (int i = 0; i < numRows; i++) 
       // replacing missing values with empty strings 
       dt.Rows[i][field.name] = i < field.results.Length ? field.results[i] : string.Empty; 
     } 

     return dt; 
    } 
} 

그리고 사용의 예 :

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var s = "[{\"name\": \"Field1\", \"results\": [\"One\", \"Two\", \"Three\"]}, {\"name\": \"Field2\", \"results\": [\"One\", \"Two\", \"Three\", \"Four\"]}]"; 
     var o = JsonConvert.DeserializeObject<List<Output>>(s); 
     // convert the list to a DataTable 
     var dt = o.ToDataTable(); 
    } 

    public class Output 
    { 
     public string name { get; set; } 
     public string[] results { get; set; } 
    } 
} 
+0

Program.Output으로 오류가 발생하는 경우 접근하기 어렵습니다. –

+0

@PrinceRathee 출력 클래스 공개 : – greenshade

+0

감사합니다. –

0

당신이 할 수있는 것은 컨버터 방법으로 DataTable을에

JsonConvert.DeserializeObject<List<CustomerJson>>(json); 

같은 Object의 목록에 다시 JSON 데이터를 변환하고 변환하는 것입니다

public static DataTable ToDataTable<T>(this IList<T> data) 
{ 
    PropertyDescriptorCollection props = 
     TypeDescriptor.GetProperties(typeof(T)); 
    DataTable table = new DataTable(); 
    for(int i = 0 ; i < props.Count ; i++) 
    { 
     PropertyDescriptor prop = props[i]; 
     table.Columns.Add(prop.Name, prop.PropertyType); 
    } 
    object[] values = new object[props.Count]; 
    foreach (T item in data) 
    { 
     for (int i = 0; i < values.Length; i++) 
     { 
      values[i] = props[i].GetValue(item); 
     } 
     table.Rows.Add(values); 
    } 
    return table;   
} 
+0

두 행만 추가되었지만 위의 예와 같이 4가되어야합니다. (예상 결과를보십시오) –

+0

당신은 어디에서 어떻게되는지보기를 꺼려합니까? 어쩌면 오류가 발생했을 수 있습니까? – STORM

+0

지금 확인해 보니 테스트를 받으 셨는데 아무 것도 없어졌습니다. –

0

나는 출력 객체의 배열에 다시 JSON 변환하는 것이 좋습니다. JsonDataContractSerializer (주석 필요) 또는 JavascriptSerializer (System.Web.Extensions 참조 필요)를 사용할 수 있습니다.

using Newtonsoft.Json; 
    using System.Collections.Generic; 
    using System.Data; 
    using System.IO; 
    using FastMember; 

클래스 :

public class Output 
    { 
     public string name { get; set; } 
     public string[] results { get; set; } 
    } 

을 그리고 :

DataTable ConstructDataTable(Output[] outputArray) 
{ 
    var table = new DataTable(); 
    var columnNames = outputArray.Select(i => i.name).Distinct().ToArray(); 
    var rows = outputArray.SelectMany(i => i.result).Distinct().ToArray(); 
    foreach(var cn in columnNames) 
    table.Columns.Add(cn, typeof(string)); 
    foreach(var r in rows) 
    { 
    object[] values = new object[columnNames.Length]; 
    for (int i = 0; i < columnNames.Length; i++) 
    { 
     values[i] = outputArray.First(i => i.name == columnNames[i]).results.FirstOrDefault(i => i == r); 
    } 
    table.Rows.Add(values); 
    } 
    return table; 
} 
0

사용 Referances :

다음과 같은 작업을 수행 할 수 있습니다 출력 객체의 배열을 갖는

 var s = "[{\"name\": \"Field1\", \"results\": [\"One\", \"Two\", \"Three\"]}, {\"name\": \"Field2\", \"results\": [\"One\", \"Two\", \"Three\", \"Four\"]}]"; 
     List<Output> data = JsonConvert.DeserializeObject<List<Output>>(s); 

     DataTable dt = new DataTable(); 
     using (var reader = ObjectReader.Create(data)) 
     { 
      dt.Load(reader); 
     } 
0
DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));