2014-03-28 3 views
0

동적 인 유형으로 가져와 배치 할 수있는 일부 JSON 데이터가 있습니다.JSON.NET C#에서 deserialised 객체에 액세스하는 중

여기가 JSON으로 보이는 방법입니다.

{"fruits":{"a":"orange","b":"banana","c":"apple"},"numbers":[1,2,3,4,5,6],"holes":{"0":"first","5":"second","6":"third"}} 

여기는 동적 유형을 사용하여 수집하는 방법입니다.

dynamic myObj =JsonConvert.DeserializeObject(output); 

개체를 구분하고 배열을 정렬하여 값을 유지할 수있는 방법을 찾아야합니다. 홀 배열을 유지하고 어떤 종류의 루프에서 모든 값에 액세스하려고한다고 가정 해보십시오.

모든 조언을 주시면 감사하겠습니다.

+0

JSON 개체의 구조를 나타내는 클래스를 만들고 JSON 데이터를 해당 클래스로 deserialize하십시오. 보기를위한 citronas 응답을보십시오. – Maritim

답변

3

System.Web.Script.Serialization.JavaScriptSerializer에서보세요 감사합니다.

는이 같은 강한 입력 된 클래스로 JSON 문자열을 역 직렬화 할 수 있습니다

데이터 클래스 :

public class AutocompleteAction 
{ 
    public String action { get; set; } 
} 

당신은 중첩 된 클래스를 가질 것이다. 구문은 다음이 parse google maps geocode json response to object using Json.Net

사용에 비슷하게 :

string json = // your json string 
JavaScriptSerializer js = new JavaScriptSerializer(); 
AutocompleteAction jsonObject = js.Deserialize<AutocompleteAction>(json); 
switch (jsonObject.action) 
{ 
    // 
} 
+0

나는 100 % 동의하지만 이것은 OP에 대한 쪽지이다. 당신의 json 객체는 단지 하나의 배열을 가지며, 다른 것들은 단지 객체 속성이다. 동적 인 것처럼 보이기 때문에 클래스를 만드는 것이 매우 어렵습니다. 객체의 배열 인 경우 키 값 쌍의 컬렉션을 수행 할 수 있습니다. – Smeegs

+0

나는 OP의 다음 문장을 이해했다. "홀 배열을 잡고 루프의 모든 값에 대한 액세스 권한을 얻고 싶다고 해봅시다." 디자인 타임에 어떤 키가 있는지 알기 때문입니다. 이 경우 클래스를 만드는 것이 유효한 옵션이 될 것입니다. – citronas

+0

'string output = writeClient.Get ("mykey"); AutocompleteAction jsonObject = js.Deserialize (출력);'현재 콘솔 응용 프로그램에서이를 중단 할 때 null입니다. 그 맞습니까? – user3036965

0

나는 Json.NET을 사용하여 결국 이런 짓을. 그것이 누군가에게 사용되기를 바랍니다. 아마도 훨씬 더 나은 접근법이 있기 때문에 논평과 비판을 좋아할 것입니다.

string output = writeClient.Get<string>("mykey"); 
      JObject myObj = (JObject)JsonConvert.DeserializeObject(output); 
      JObject fruits = myObj["fruits"] as JObject; 
      JObject holes = myObj["holes"] as JObject; 

      foreach (var fruit in fruits) 
      { 

       MyTestClass myClass = new MyTestClass(); 
       myClass.myKey = fruit.Key; 
       myClass.myVal = fruit.Value.ToString(); 

      } 

      JToken nums = myObj["nums"]; 
      IEnumerable<string> allString = nums.Children().Values<string>(); 

      foreach (var myVal in allString) 
      { 
       // do something.. 
      }