[c#] JObject로 즉석에서 JSON 만들기

일부 단위 테스트의 경우 테스트중인 시스템의 입력으로 사용할 수있는 특정 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");

이것은 잘 작동하지만 “매직 문자열”구문이 마음에 들지 않았으며 다음과 같이 JavaScript의 expando-property 구문에 더 가까운 것을 선호합니다.

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



답변

글쎄, 어때?

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


답변

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 문서


답변

어느 쪽도 dynamic없으며, JObject.FromObject당신은 예를 들어, 유효한 C # 변수 이름없는 JSON 속성이있을 때 솔루션은 작동하지 않습니다 "@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 }
        }
    }
};


답변

동적 (예 : 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")
         )

추가 문서 :
http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


답변

속성에서 newtonsoft JObject를 만드는 간단한 방법입니다.

이것은 샘플 사용자 속성입니다.

public class User
{
    public string Name;
    public string MobileNo;
    public string Address;
}

그리고 나는 newtonsoft JObject 에서이 속성을 원합니다.

JObject obj = JObject.FromObject(new User()
{
    Name = "Manjunath",
    MobileNo = "9876543210",
    Address = "Mumbai, Maharashtra, India",
});

출력은 다음과 같습니다.

{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}


답변

조만간 당신은 특별한 성격을 가진 재산을 갖게 될 것입니다. 인덱스 또는 인덱스와 속성의 조합을 사용할 수 있습니다.

dynamic jsonObject = new JObject();
jsonObject["Create-Date"] = DateTime.Now; //<-Index use
jsonObject.Album = "Me Against the world"; //<- Property use
jsonObject["Create-Year"] = 1995; //<-Index use
jsonObject.Artist = "2Pac"; //<-Property use


답변

Newtonsoft 라이브러리를 사용하고 다음과 같이 사용할 수 있습니다.

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 );