2013-08-14 6 views
27

JSON 데이터 작업에 익숙하지 않습니다.JSON 데이터를 비 직렬화하는 방법은 무엇입니까?

웹 서비스에서 데이터를 읽습니다.

[["B02001_001E","NAME","state"], 
["4712651","Alabama","01"], 
["691189","Alaska","02"], 
["6246816","Arizona","04"], 
["18511620","Florida","12"], 
["9468815","Georgia","13"], 
["1333591","Hawaii","15"], 
["1526797","Idaho","16"], 
["3762322","Puerto Rico","72"]] 

내가 먼저 객체가 어떤지 정의하지 않고 기본 오브젝트가 생성되도록하는 방식으로이 데이터를 역 직렬화 할 수있는 방법이 있나요 : 다시 전송 쿼리 데이터는 다음과 같다? 상기 예에서, 목적은 첫 번째 행에 의해 정의된다 : 일반적

  ["B02001_001E","NAME","state"], 

첫 번째 행은 열 이름과 후속 열을 제공하는 이차원 JSON 어레이로서 포맷 질의 데이터를 리턴하여 웹 서비스 데이터 값을 제공한다 .

답변

43

정말 간단하게 직렬화 해제 할 수 있습니다. C#의 데이터 구조는 단지 List<string[]>이므로 방금 할 수 있습니다.

List<string[]> data = JsonConvert.DeserializeObject<List<string[]>>(jsonString); 

위 코드는 json.NET을 사용한다고 가정합니다.

편집 : json은 기술적으로 문자열 배열의 배열입니다. 나는 더 직관적이기 때문에 내 자신의 선언에 List<string[]>을 사용하는 것을 선호한다. 그것은 json.NET에 대한 어떤 문제도 일으키지 않을 것입니다. 문자열 배열의 배열을 원한다면 (내가 생각하기에) string[][]을 타입을 변경해야합니다. 그러나 C#에서 들쭉날쭉 한 2D 배열로 재미있는 작은 잡아들이 있습니다. 나는 그것에 대해 정말로 모른다. 그래서 나는 단지 여기에서 그것을 다루는 것을 귀찮게하지 않는다.

0

1 단계 : json.org에서이 웹 서비스를 호출하는 데 사용하는 기술에 대한 JSON 라이브러리를 찾으십시오. 해당 라이브러리를 다운로드하여 링크하십시오.

2 단계 : 자바를 사용한다고 가정 해 보겠습니다. 이 같은 JSONArray를 사용합니다 : 닷넷 4.5

using System.Runtime.Serialization.Json; 
...  
Stream jsonSource = ...; // serializer will read data stream 
var s = new DataContractJsonSerializer(typeof(string[][])); 
var j = (string[][])s.ReadObject(jsonSource); 

이상 당신은 JavaScriptSerializer 클래스를 사용할 수 있습니다 : 당신은 닷넷 4.5을 사용하는 경우

JSONArray myArray=new JSONArray(queryResponse); 
for (int i=0;i<myArray.length;i++){ 
    JSONArray myInteriorArray=myArray.getJSONArray(i); 
    if (i==0) { 
     //this is the first one and is special because it holds the name of the query. 
    }else{ 
     //do your stuff 
     String stateCode=myInteriorArray.getString(0); 
     String stateName=myInteriorArray.getString(1); 
    } 
} 
29

당신은 또한 표준 닷넷 JSON 시리얼 라이저를 사용할 수 있습니다

using System.Web.Script.Serialization; 
... 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
string[][] list = serializer.Deserialize<string[][]>(json); 
0

독자적인 JSON 구문 분석기를 작성하여 요구 사항에 따라보다 일반적인 형식으로 만들 수 있습니다. 여기 내 목적을 잘 섬긴 것, 희망도 도움이 될 것입니다.

class JsonParsor 
{ 
    public static DataTable JsonParse(String rawJson) 
    { 
     DataTable dataTable = new DataTable(); 
     Dictionary<string, string> outdict = new Dictionary<string, string>(); 
     StringBuilder keybufferbuilder = new StringBuilder(); 
     StringBuilder valuebufferbuilder = new StringBuilder(); 
     StringReader bufferreader = new StringReader(rawJson); 
     int s = 0; 
     bool reading = false; 
     bool inside_string = false; 
     bool reading_value = false; 
     bool reading_number = false; 
     while (s >= 0) 
     { 
      s = bufferreader.Read(); 
      //open JSON 
      if (!reading) 
      { 
       if ((char)s == '{' && !inside_string && !reading) 
       { 
        reading = true; 
        continue; 
       } 
       if ((char)s == '}' && !inside_string && !reading) 
        break; 
       if ((char)s == ']' && !inside_string && !reading) 
        continue; 
       if ((char)s == ',') 
        continue; 
      } 
      else 
      { 
       if (reading_value) 
       { 
        if (!inside_string && (char)s >= '0' && (char)s <= '9') 
        { 
         reading_number = true; 
         valuebufferbuilder.Append((char)s); 
         continue; 
        } 
       } 
       //if we find a quote and we are not yet inside a string, advance and get inside 
       if (!inside_string) 
       { 
        if ((char)s == '\"' && !inside_string) 
         inside_string = true; 
        if ((char)s == '[' && !inside_string) 
        { 
         keybufferbuilder.Length = 0; 
         valuebufferbuilder.Length = 0; 
           reading = false; 
           inside_string = false; 
           reading_value = false; 
        } 
        if ((char)s == ',' && !inside_string && reading_number) 
        { 
         if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) 
          dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); 
         if (!outdict.ContainsKey(keybufferbuilder.ToString())) 
          outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); 
         keybufferbuilder.Length = 0; 
         valuebufferbuilder.Length = 0; 
         reading_value = false; 
         reading_number = false; 
        } 
        continue; 
       } 

       //if we reach end of the string 
       if (inside_string) 
       { 
        if ((char)s == '\"') 
        { 
         inside_string = false; 
         s = bufferreader.Read(); 
         if ((char)s == ':') 
         { 
          reading_value = true; 
          continue; 
         } 
         if (reading_value && (char)s == ',') 
         { 
          //put the key-value pair into dictionary 
          if(!dataTable.Columns.Contains(keybufferbuilder.ToString())) 
           dataTable.Columns.Add(keybufferbuilder.ToString(),typeof(string)); 
          if (!outdict.ContainsKey(keybufferbuilder.ToString())) 
          outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); 
          keybufferbuilder.Length = 0; 
          valuebufferbuilder.Length = 0; 
          reading_value = false; 
         } 
         if (reading_value && (char)s == '}') 
         { 
          if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) 
           dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); 
          if (!outdict.ContainsKey(keybufferbuilder.ToString())) 
           outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); 
          ICollection key = outdict.Keys; 
          DataRow newrow = dataTable.NewRow(); 
          foreach (string k_loopVariable in key) 
          { 
           CommonModule.LogTheMessage(outdict[k_loopVariable],"","",""); 
           newrow[k_loopVariable] = outdict[k_loopVariable]; 
          } 
          dataTable.Rows.Add(newrow); 
          CommonModule.LogTheMessage(dataTable.Rows.Count.ToString(), "", "row_count", ""); 
          outdict.Clear(); 
          keybufferbuilder.Length=0; 
          valuebufferbuilder.Length=0; 
          reading_value = false; 
          reading = false; 
          continue; 
         } 
        } 
        else 
        { 
         if (reading_value) 
         { 
          valuebufferbuilder.Append((char)s); 
          continue; 
         } 
         else 
         { 
          keybufferbuilder.Append((char)s); 
          continue; 
         } 
        } 
       } 
       else 
       { 
        switch ((char)s) 
        { 
         case ':': 
          reading_value = true; 
          break; 
         default: 
          if (reading_value) 
          { 
           valuebufferbuilder.Append((char)s); 
          } 
          else 
          { 
           keybufferbuilder.Append((char)s); 
          } 
          break; 
        } 
       } 
      } 
     } 

     return dataTable; 
    } 
} 
관련 문제