JObject로 즉석에서 JSON 만들기


97

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

5
아티스트 / 앨범 선택시 2 배 포인트 획득!
spottedmahn

답변:


144

글쎄, 어때?

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

3
완전한! 정확히 내가 찾던 것, 완전히 잊어 버렸습니다 dynamic.
Karl Anderson

코드를 실행하려고 할 때 'Newtonsoft.Json.Linq.JObject'에 'Date'오류에 대한 정의가 포함되어 있지 않습니다. 내가 작동하도록 만드는 방법은 첫 번째 줄을 다음 dynamic jsonExpando = new ExpandoObject();과 같이 변경하고 코드 뒤에 줄을 추가하는 것입니다.JObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode

3
Json 객체에 List <>를 추가하려면 jsonObject.list = JToken.FromObject(mylist);.
Steve Smith

특수 문자가있는 필드 명 (예 : Create-Year)을 치면 인덱스와 속성 표기법의 조합을 사용할 수 있습니다. jsonObject.Create-Year = 1995는 쓸 수 없지만 다음은 사용할 수 있습니다. jsonObject [ "Create-Year "] = 1995; jsonObject.Artist ="2Pac ";
PAS

72

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


10
JObject.FromObject가 정답으로 표시되어야합니다. 감사.
Thomas

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

39

어느 쪽도 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 }
        }
    }
};

2
마지막 것은 C #에서 json을 작성하는 가장 좋은 구문입니다.
Anthony Brenelière

컬렉션으로이 작업을 수행하는 방법 은 stackoverflow.com/questions/51015036/… 참조
kofifus

30

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


2

속성에서 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"}

2

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

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

이것은 질문에 어떻게 대답합니까?
Enigmativity

@Enigmativity, 내가 말하는 요점은 인덱스 표기법과 속성 표기법을 함께 사용할 수 있다는 것입니다. 즉 obj [x] = x1; obj.y = y1은 동일한 코드에서 사용할 수 있습니다. 동적 키워드와 색인 표기법의 조합이 질문에 답합니다. 다른 답변은 이것을 언급하지 않았습니다. 아마도 이것은 답변 이라기보다는 주석이어야합니다.
PAS

나는 그 질문이 마법의 끈을 사용하지 않는 것에 관한 것이라고 생각하지만이 대답은 그에게 그것을 준다.
Enigmativity

@Enigmativity, dynamic 키워드는 컴파일러를 속일뿐입니다. 따라서 임의의 문자열과 다르지 않습니다. 동적 유형의 개체가 강력한 유형이 아닙니다. 그것은 단지 통사론 적 설탕 일뿐입니다. 기본 개체에 속성이 없으면 런타임에 실패합니다. 그러나 속성 이름에 특수 문자 (예 : 99BottlesOfBeer, 네임 스페이스, It's-All-Over)가 포함 된 경우 속성을 사용할 수 없습니다. 따라서 이러한 경우 인덱싱 된 속성을 사용할 수 있습니다. 다른 대답은 그것이 하나 또는 다른 것이라고 생각하지만 속성과 색인을 혼합하고 일치시킬 수 있습니다.
PAS

-3

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

5
여기에서는 newtonsoft 라이브러리를 실제로 사용하지 않습니다
Mickey Perlstein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.