2014-10-23 2 views
1

저는 C#에서 JSON.NET을 사용하여 JSON을 출력으로 제공하는 API에 연결하려고합니다.배열 전체에서 JSON 객체의 누락 된 속성을 채울 방법이 있습니까?

출력을 CSV로 콘솔에 출력하여 powershell convertfrom-csv, format-table, select-object 등으로 소비 할 수 있습니다.

모든 종류의 JSON을 CSV로 인쇄하기위한 일반적인 방법이 있는데 거의 항상 작동합니다. result에서 마지막 항목이 완전히 product 재산 누락되는 경우

는하지만, 어떤 경우에는,이

{ 
    "result": 
    [ 
     { "product": "SP1", "version": "6.0" }, 
     { "product": "SP1 hf 40", "version": "6.0.40" }, 
     { "product": "SP1 hf 50", "version": "6.0.50" }, 
     { "version": "6.0.100" } 
    ] 
} 

같은 JSON을 얻을.

출력이되도록 result의 항목을 반복 할 수있는 방법이 있나요 및 누락 된 속성에 넣어 :이 나를 JSON 출력으로 인쇄를위한 일반적인 방법을 계속 사용할 수

{ 
    "result": 
    [ 
     { "product": "SP1", "version": "6.0" }, 
     { "product": "SP1 hf 40", "version": "6.0.40" }, 
     { "product": "SP1 hf 50", "version": "6.0.50" }, 
     { "product": "", "version": "6.0.100" } 
    ] 
} 

CSV.

결과 배열을 반복하고 가장 많은 속성을 가진 요소를 찾고이를 CSV 인쇄의 기초로 사용하는 것이 하나의 아이디어였습니다.

그러나 속성의 수가 모든 세트의 모든 속성을 반드시 보장하지는 않기 때문에 그 아이디어는 꽤 평평합니다.

배열의 모든 요소에서 모든 속성을 찾을 UNION 형식 연산이 거의 필요하다고 생각합니다.

죄송합니다. 정말 바보 같은 질문이지만 가능한 경우 궁금한 내용이었습니다.

+1

http://stackoverflow.com/questions/11132288/iterating-over-json-object @BnWasteland 제안 여기 2- 패스 접근 방식을 사용하는 예는 -in-c-sharp 이 방법이 도움이됩니까? – csprabala

답변

0

예, JSON에 누락 된 속성을 채울 수 있습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @" 
     { 
      ""result"" : 
      [ 
       { ""a"" : ""a1"" }, 
       { ""b"" : ""b1"" }, 
       { ""c"" : ""c1"", ""d"" : ""d1"", ""a"" : ""a2"" }, 
       { ""a"" : ""a3"", ""d"" : ""d2"" }, 
       { ""b"" : ""b2"", ""c"" : ""c2"" }, 
      ] 
     }"; 

     JObject jo = JObject.Parse(json); 
     JArray ja = FillMissingProperties((JArray)jo["result"]); 
     jo["result"] = ja; 
     Console.WriteLine(jo.ToString()); 
    } 

    public static JArray FillMissingProperties(JArray array) 
    { 
     // find all distinct property names across all objects in the array 
     ISet<string> names = new SortedSet<string>(); 
     foreach (JObject obj in array.Children<JObject>()) 
     { 
      foreach (JProperty prop in obj.Properties()) 
      { 
       names.Add(prop.Name); 
      } 
     } 

     // copy objects to a new array, adding missing properties along the way 
     JArray arrayOut = new JArray(); 
     foreach (JObject obj in array.Children<JObject>()) 
     { 
      JObject objOut = new JObject(); 
      foreach (string name in names) 
      { 
       JToken val = obj[name]; 
       if (val == null) 
       { 
        val = new JValue(""); 
       } 
       objOut.Add(name, val); 
      } 
      arrayOut.Add(objOut); 
     } 

     return arrayOut; 
    } 
} 

출력 :

{ 
    "result": [ 
    { 
     "a": "a1", 
     "b": "", 
     "c": "", 
     "d": "" 
    }, 
    { 
     "a": "", 
     "b": "b1", 
     "c": "", 
     "d": "" 
    }, 
    { 
     "a": "a2", 
     "b": "", 
     "c": "c1", 
     "d": "d1" 
    }, 
    { 
     "a": "a3", 
     "b": "", 
     "c": "", 
     "d": "d2" 
    }, 
    { 
     "a": "", 
     "b": "b2", 
     "c": "c2", 
     "d": "" 
    } 
    ] 
} 
2

물론 가능합니다. 작동 할 수있는 접근법이 많이 있습니다. 예를 들어, 2 회 통과 만하면됩니다. 첫 번째 패스에서는 전체 속성 목록을 만들고 두 번째 패스에서는 전체 헤더를 사용하여 CSV에 출력합니다.

아무리 공격해도 스트리밍 할 때 정상적으로 작동하지 않습니다.

Powershell 3.0 이상은 ConvertFrom-Json과 함께 제공됩니다. http://technet.microsoft.com/en-us/library/hh849898.aspx

+0

ConvertFrom-Json을 많이 좋아하지만 코드 내에서 json 출력을 변환하기 위해 C#에서 인스턴스화 할 수있는 방법을 알아내는 데 문제가 있습니다. 아마도 나는 그것에 대해 다른 질문을해야 할 것입니다. 감사! – anoopb

관련 문제