2016-10-10 2 views
1

C# 클래스 및 값을 포함하는 속성을 사용하여 jsonObject 및 json 배열을 만들려고합니다. 아래의 전체 코드를 참조하십시오. C# 클래스 속성을 Json 파일로 변환하는 방법

public class Product 
    { 
     public Int32 Id { get; set; } 
     public String FirstName { get; set; } 
     public String LastName { get; set; } 
     public String Address { get; set; } 
    } 


protected void Button1_Click(object sender, EventArgs e) 
    { 

     Product pr = new Product(); 
     pr.Id = 10; 
     pr.FirstName = "John"; 
     pr.LastName = "ab"; 
     pr.Address = "My Add1"; 

     string json = JsonConvert.SerializeObject(pr,Formatting.Indented); 
     System.IO.File.WriteAllText(@"d:\abcjson.json", json); 
    } 

상기 코드는 다음을 출력

{ 
    "Id": 10, 
    "FirstName": "John", 
    "LastName": "ab", 
    "Address": My Add1, 
} 

제공하지만 난 된 JSONObject 및 jsonArray 다음에 다음 출력을 필요로한다. 제발 어떻게 든 아래의 출력을 얻을 수있는 위의 json 코드를 사용하여 어떤 버튼을 클릭하십시오. 미리 감사드립니다.

{ 
"Product":[ 
    { 
    "Id": 10, 
    "FirstName ":"John", 
    "lastName":"ab", 
    "Address":My add1 
    } 
] 
} 
+0

JSON을 입력 할 수있는 꽤 괜찮은 온라인 도구가 있으며이를 반영하는 C# 클래스가 생성됩니다. 그냥 "json to C# converter"또는 뭔가. 웹 사이트는 사실 csharp2json.com 또는 iirc – Lodestone6

+0

이라 불리우는 다른 클래스를 생성하여이 현재 루트의 루트 역할을하는 것처럼 간단 할 수도 있습니다. 그냥 public class와 같은 것 rootProduct() {public Product product {get; set;;}} 그런 다음 "rootProduct.Product.ID = 10;"과 같은 항목을 모두 선언 한 후 rootProduct를 직렬화합니다. – Lodestone6

답변

11

원하는 것은 원하는 JSON을 살펴 보는 것입니다. 제품 객체 배열 인 Product 속성이있는 객체입니다. 그런 다음

public class JsonRoot 
{ 
    [JsonProperty("Product")] 
    public List<Product> Products { get; set; } 
} 

방금 ​​사용할 수 있습니다 :

var root = new JsonRoot { Products = new List<Product> { pr } }; 
string json = JsonConvert.SerializeObject(root, Formatting.Indented); 

당신은 대신 익명 형식을 사용할 수, 잠재적 :

그래서 그렇게하는 가장 간단한 방법은 클래스 모델을 만드는 것입니다

var root = new { Product = new[] { pr } }; 

개인적으로는 내가 아니야 경향 믹스를 좋아하는 사람 직렬화라는 이름의 형식과 익명 형식 g하지만 @JonSkeet이 제안

+0

답장을 보내 주셔서 감사합니다. 원하는 출력을 얻으려면 별도의 클래스를 만들어야합니까? 그렇다면 내 질문에 왜 JsonRoot로 말합니까? 내 바보 같은 질문에 대한 미안하지만 내 혼란을 정리해야합니다. –

+0

그리고 왜 [JsonProperty ("Product")]처럼 JsonProperty라고 불렀습니다. 감사합니다. –

+0

@RaufAbid : JSON 출력의 루트 객체로 사용하기 때문에'JsonRoot'라고했습니다. 나는'JsonProperty' 속성을 사용하여 JSON에서'Products' 속성 (복수형으로 인해 관용적 인 C#)을'Property'에 "재 명명"했습니다. –

3
protected void Button1_Click(object sender, EventArgs e) 
{ 
    var pr = new 
    { 
     Product = new[] 
     { 
      new Product 
      { 
       Id = 10, 
       FirstName = "John", 
       LastName = "ab", 
       Address = "My Add1" 
      } 
     } 
    }; 

    string json = JsonConvert.SerializeObject(pr,Formatting.Indented); 
    System.IO.File.WriteAllText(@"d:\abcjson.json", json); 
} 
+0

그 다양한 이유로 컴파일되지 않습니다. –

+0

@ 존 키켓, 죄송합니다. 과거를 복사하고 부주의합니다. 결정된. –

+0

훨씬 더 :) 나는 내 대답에 익명 유형 옵션을 포함 시켰습니다. 아마 내가하는 일이 아니며, 만약 내가 해낸 것이라면, 보통의' 제품 '이지만 그것은 단지 개인 스타일의 선택 일뿐입니다. –

1

간단한 해결책은, 콜렉션으로 개체를 넣어 ... 괜찮 작동합니다.

List<Product>과 별도의 json 래퍼 클래스와 같이 사용할 수없는 솔루션을 만들려면 @MarkShevchenko가 제안한대로 익명 형식 배열을 사용하거나 JsonWriter 클래스에서 다음과 같은 방법으로 작업 할 수 있습니다.

StringBuilder sb = new StringBuilder(); 
StringWriter sw = new StringWriter(sb); 

using (JsonWriter writer = new JsonTextWriter(sw)) 
{ 
    writer.Formatting = Formatting.Indented; 

    writer.WriteStartObject(); // { 
    writer.WritePropertyName("Product"); // "Product:" 
    writer.WriteStartArray(); // [ 
    writer.WriteRaw(JsonConvert.SerializeObject(pr)); // your object 
    writer.WriteEnd(); // ] 
    writer.WriteEndObject(); //} 
} 

var result = sb.ToString(); 

결과 문자열은 익명의 배열과 별도의 클래스를 만들지 않고 result에 저장됩니다.

관련 문제