2009-07-30 5 views

답변

37

JValue에만 문자열의 int, 부울, 날짜 등 같은 간단한 값을 포함 할 수 있습니다. 복잡한 객체를 포함 할 수 없습니다.

List<User> list = LoadUsers(); 

JObject json = new JObject(); 

json["users"] = JToken.FromObject(list); 

위, 사용자를 대표하는 JObjectsJArrayUser 개체의 목록을 변환합니다 다음 새 JObjectusers 속성에 그 지정 : 나는 당신이 정말 원하는 것은 이것이다 생각한다. Type 속성이 json["users"]인지 확인하고 Array임을 확인하면이를 확인할 수 있습니다.

이와 대조적으로이 질문에 대한 다른 대답에서 제안한대로 json["users"] = new JValue(JsonConvert.SerializeObject(list))을 입력하면 찾고있는 결과를 얻지 못할 수도 있습니다. 이 방법을 사용하면 사용자 목록이 문자열로 serialize되고 간단한 JValue을 만든 다음 JObjectusers 속성에 JValue을 할당 할 수 있습니다. Type 속성이 json["users"] 인 것을 확인하면 String이라는 것을 알 수 있습니다. 이것이 의미하는 바는 나중에 json.ToString()을 사용하여 JObject을 JSON으로 변환하려고하면 예상 한 JSON 대신 이중 직렬화 출력이 생성됩니다. 여기

차이를 설명하는 짧은 데모입니다 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<User> list = new List<User> 
     { 
      new User { Id = 1, Username = "john.smith" }, 
      new User { Id = 5, Username = "steve.martin" } 
     }; 

     JObject json = new JObject(); 

     json["users"] = JToken.FromObject(list); 
     Console.WriteLine("First approach (" + json["users"].Type + "):"); 
     Console.WriteLine(); 
     Console.WriteLine(json.ToString(Formatting.Indented)); 

     Console.WriteLine(); 
     Console.WriteLine(new string('-', 30)); 
     Console.WriteLine(); 

     json["users"] = new JValue(JsonConvert.SerializeObject(list)); 
     Console.WriteLine("Second approach (" + json["users"].Type + "):"); 
     Console.WriteLine(); 
     Console.WriteLine(json.ToString(Formatting.Indented)); 
    } 

    class User 
    { 
     public int Id { get; set; } 
     public string Username { get; set; } 
    } 
} 

출력 :

First approach (Array): 

{ 
    "users": [ 
    { 
     "Id": 1, 
     "Username": "john.smith" 
    }, 
    { 
     "Id": 5, 
     "Username": "steve.martin" 
    } 
    ] 
} 

------------------------------ 

Second approach (String): 

{ 
    "users": "[{\"Id\":1,\"Username\":\"john.smith\"},{\"Id\":5,\"Username\":\"steve.martin\"}]" 
} 
+1

이 근무 사용할 수 있습니다! 감사합니다 – s0nica

+0

고마워요. 이것은 내가 하루 종일 알아 내려고 노력했던 것입니다. – Trebor

+0

완벽합니다. 왜 이것이 답변으로 표시되지 않습니까? – killernerd

0

내가 가지고이 문제는, 당신은 지금 당신이 단지를 원하는 경우,이 작업이 완료 얻을 수는 jarray을 사용할 수 있습니다 루트 이름이없는 항목을 배열합니다. 당신이 "사용자"로 json으로 배열의 루트 이름을 원하는 경우

var json = JArray.FromObject(LoadUsers()); 

, 당신은 나를 위해

var json = new JObject { ["users"] = JToken.FromObject(LoadUsers()) }; 
관련 문제