2016-10-10 5 views
1

jsonObjectとjsonの配列を、C#クラスとその値を含むプロパティを使用して作成しようとしています。以下の完全なコードをご覧ください。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#クラスが生成されます。ちょうどgoogle "json to c#converter"または何か。ウェブサイトは実際にはcsharp2json.comまたは何かiirc – Lodestone6

+0

と呼ばれています。これは、現在のクラスのルートとして動作する別のクラスを作成するのと同じくらい簡単かもしれません。 publicクラスのようなものです。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 } }; 

私個人ではありませんtendをとmixinしたい直列化のための名前付きの型と匿名型グラムが、それは@JonSkeetが示唆したように

+0

お返事ありがとうございます。希望の出力を得るために別のクラスを作成する必要がありますか?はいの場合、私の質問はなぜあなたがJsonRootとしてそれを言うのですか?私の愚かな質問を申し訳ありませんが、私は私の混乱を解消する必要があります。 –

+0

そしてなぜあなたは[JsonProperty( "Product")]のようにJsonPropertyを呼び出しましたか?ありがとう –

+0

@RaufAbid:JSON出力のルートオブジェクトとして使用するので、これを 'JsonRoot'と呼びました。私は 'JsonProperty'属性を使用して、JSONの' Property'に 'Products'プロパティ(複数であるために慣用のC#)を"名前を変更 "しました。 –

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

@JonSkeet、申し訳ありません。過去のコピーと不注意。一定。 –

+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に保存されます。

関連する問題