2013-08-15 2 views
39

일부 단위 테스트의 경우 테스트중인 시스템의 입력으로 사용할 수있는 특정 JSON 값 (이 경우 레코드 앨범)을 빌드 할 수 있어야합니다.JObject를 사용하여 즉석에서 JSON 만들기

나는 다음과 같은 코드를 가지고 :

var jsonObject = new JObject(); 
jsonObject.Add("Date", DateTime.Now); 
jsonObject.Add("Album", "Me Against The World"); 
jsonObject.Add("Year", 1995); 
jsonObject.Add("Artist", "2Pac"); 

이 잘 작동하지만 나는 "마법 문자열"구문처럼 정말 한번도와 같은 자바 스크립트에서의 expando 재산권 구문에 가까운 무언가를 선호하는 것 :

jsonObject.Date = DateTime.Now; 
jsonObject.Album = "Me Against The World"; 
jsonObject.Year = 1995; 
jsonObject.Artist = "2Pac"; 

답변

69

음,에 대한 방법 : 당신은 Newtonsoft의 librar을 사용할 수 있습니다

dynamic jsonObject = new JObject(); 
jsonObject.Date = DateTime.Now; 
jsonObject.Album = "Me Against the world"; 
jsonObject.Year = 1995; 
jsonObject.Artist = "2Pac"; 
+2

딱! 정확히 내가 찾고 있던 것이 완전히 '동적 인'것을 잊어 버렸습니다. –

+0

기꺼이 도와 드리겠습니다;) 건배 –

+0

코드를 실행하려고하면 'Newtonsoft.Json.Linq.JObject'에 'Date'정의가 없습니다. 내가 할 수있는 방법은 첫 줄을'dynamic jsonExpando = new ExpandoObject();'로 바꾸고 코드 뒤에'JObject jsonObject = JObject '라는 줄을 추가하는 것이다.FromObject (jsonExpando);' – BornToCode

-3

y를

using Newtonsoft.Json; 



public class jb 
{ 
    public DateTime Date { set; get; } 
    public string Artist { set; get; } 
    public int Year { set; get; } 
    public string album { set; get; } 

} 
var jsonObject = new jb(); 

jsonObject.Date = DateTime.Now; 
jsonObject.Album = "Me Against The World"; 
jsonObject.Year = 1995; 
jsonObject.Artist = "2Pac"; 


System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
     new System.Web.Script.Serialization.JavaScriptSerializer(); 

string sJSON = oSerializer.Serialize(jsonObject); 
+3

여기 실제로 newtonsoft 라이브러리를 사용하지 않습니다 –

36

를 다음과 같이 당신은 JObject.Parse 작업을 사용하여 간단하게 따옴표를 제공 할 수 있습니다 사용은 JSON 텍스트를 구분.

JObject o = JObject.Parse(@"{ 
    'CPU': 'Intel', 
    'Drives': [ 
    'DVD read/writer', 
    '500 gigabyte hard drive' 
    ] 
}"); 

이것은 실제로 JSON이라는 좋은 이점을 가지고 있으므로 JSON으로 읽습니다.

동적 인 테스트 데이터가 있거나 JObject.FromObject 조작을 사용하여 인라인 오브젝트를 제공 할 수 있습니다.

JObject o = JObject.FromObject(new 
{ 
    channel = new 
    { 
     title = "James Newton-King", 
     link = "http://james.newtonking.com", 
     description = "James Newton-King's blog.", 
     item = 
      from p in posts 
      orderby p.Title 
      select new 
      { 
       title = p.Title, 
       description = p.Description, 
       link = p.Link, 
       category = p.Categories 
      } 
    } 
}); 

Json.net documentation for serialization

+3

JObject.FromObject를 정답으로 표시해야합니다. 감사. – Thomas

+0

'-'와 같은 특수 문자가있는 속성이 있으면'JObject.FromObject'가 작동하지 않을 것이라고 생각합니다. –

12

은 방금 이전 유효한 응답에 대한 대안을 찾아 어디에서 동적 인 (예를 들어, Xamarin.iOS) 또는 케이스를 사용할 수있는 환경이 있습니다. 이러한 경우

당신은 할 수 있습니다 :

using Newtonsoft.Json.Linq; 

JObject jsonObject = 
    new JObject(
      new JProperty("Date", DateTime.Now), 
      new JProperty("Album", "Me Against The World"), 
      new JProperty("Year", "James 2Pac-King's blog."), 
      new JProperty("Artist", "2Pac") 
     ) 
여기

더 많은 문서 : 유효한 C#을 변수 이름은 예를 들어,없는 JSON 속성이있을 때 http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm

2

어느 dynamic,도 JObject.FromObject 솔루션 작동 "@odata.etag". 나는 내 테스트의 경우 인덱서 초기화 구문을 선호 :

JObject jsonObject = new JObject 
{ 
    ["Date"] = DateTime.Now, 
    ["Album"] = "Me Against The World", 
    ["Year"] = 1995, 
    ["Artist"] = "2Pac" 
}; 

JObject을 초기화 문자를 둘러싸는 별도의 세트를 가졌하고, 특히 화합물 JSON의 경우, 고전 개체 이니셜 라이저보다 더 읽을 인덱스 이니셜을 만드는에 속성을 추가 다음과 같이 객체 : 객체 이니셜 구문

JObject jsonObject = new JObject 
{ 
    ["Date"] = DateTime.Now, 
    ["Album"] = "Me Against The World", 
    ["Year"] = 1995, 
    ["Artist"] = new JObject 
    { 
     ["Name"] = "2Pac", 
     ["Age"] = 28 
    } 
}; 

은, 위의 초기화가 될 것이다 :

JObject jsonObject = new JObject 
{ 
    { "Date", DateTime.Now }, 
    { "Album", "Me Against The World" }, 
    { "Year", 1995 }, 
    { "Artist", new JObject 
     { 
      { "Name", "2Pac" }, 
      { "Age", 28 } 
     } 
    } 
}; 
+0

마지막은 C#에서 json을 작성하는 데 가장 좋은 구문입니다. – abreneliere

관련 문제