JSONのシリアライズ

下のようなJSONを生成します。

[
    {
        "lastName":"山田",
        "firstName":"太郎",
        "contactInfos":[
            {
                "type":"会社"
                "address":"東京都○区△町1-2-3",
            },
            {
                "type":"自宅"
                "address":"東京都○区△町1-2-3",
            }
        ],
        "purchasedID":[
            101,501,701
        ]
    },
    {
        "lastName":"佐藤",
        "firstName":"花子",
        "contactInfos":[
            {
                "type":"自宅"
                "address":"神奈川県○区△町1-2-3",
            }
        ],
        "purchasedID":[
            101,501,701
        ]
    }
]

JSON の形式にあったクラスを準備します。JSONがネストしているところはListや配列で対応します。

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace JSONHandling
{
    /// <summary>
    /// 顧客クラス
    /// </summary>
    [DataContract]
    public class Customer
    {
        /// <summary>
        /// 苗字
        /// </summary>
        [DataMember(Name = "lastName")]
        public string LastName { get; set; }

        /// <summary>
        /// 名前
        /// </summary>
        [DataMember(Name = "firstName")]
        public string FirstName { get; set; }

        /// <summary>
        /// 連絡先リスト
        /// </summary>
        [DataMember(Name = "contactInfos")]
        public List<ContactInfo> ContactInfos { get; set; }

        /// <summary>
        /// 購入商品IDリスト
        /// </summary>
        [DataMember(Name = "purchasedID")]
        public List<int?> PurchasedID { get; set; }
    }

    /// <summary>
    /// 連絡先情報
    /// </summary>
    [DataContract]
    public class ContactInfo
    {
        /// <summary>
        /// 連絡先タイプ
        /// </summary>
        [DataMember(Name = "type")]
        public string Type { get; set; }

        /// <summary>
        /// 住所
        /// </summary>
        [DataMember(Name = "address")]
        public string Address { get; set; }
    }
}

クラスに値を設定したら、System.Runtime.Serialization.Json.DataContractJsonSerializerを使用してシリアライズします。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Json;
using System.IO;

namespace JSONHandling
{
    class Program
    {
        static void Main(string[] args)
        {
            //山田さんの顧客情報作成
            var yamada = new Customer()
            {
                LastName = "山田",
                FirstName = "太郎",
                ContactInfos = new List<ContactInfo>()
                {
                    new ContactInfo()
                    {
                        Type = "会社",
                        Address = "東京都○区△町1-2-3",
                    },

                    new ContactInfo()
                    {
                        Type = "自宅",
                        Address = "東京都○区△町1-2-3",
                    },
                },
                PurchasedID = new List<int?>() { 101,501,701 },
            };

            //佐藤さんの顧客情報作成
            var sato = new Customer()
            {
                LastName = "佐藤",
                FirstName = "花子",
                ContactInfos = new List<ContactInfo>()
                {
                    new ContactInfo()
                    {
                        Type = "自宅",
                        Address = "神奈川県○区△町1-2-3",
                    },
                },
                PurchasedID = new List<int?>() { 101, 501, 701 },
            };

            //顧客リストを作成
            var customers = new List<Customer>();
            customers.Add(yamada);
            customers.Add(sato);

            //シリアライズしてメモリストリームに書き込む
            var serializer = new DataContractJsonSerializer(typeof(List<Customer>));
            var ms = new MemoryStream();
            serializer.WriteObject(ms, customers);
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));

#if DEBUG
            Console.ReadLine();
#endif
        }
    }
}

実行結果

[{"contactInfos":[{"address":"東京都○区△町1-2-3","type":"会社"},{"address":"東
京都○区△町1-2-3","type":"自宅"}],"firstName":"太郎","lastName":"山田","purchas
edID":[101,501,701]},{"contactInfos":[{"address":"神奈川県○区△町1-2-3","type":
"自宅"}],"firstName":"花子","lastName":"佐藤","purchasedID":[101,501,701]}]

整形するときちんと出力されていることがわかります(※プロパティのアルファベット順にソートされています)

[
    {
        "contactInfos":[
            {
                "address":"東京都○区△町1-2-3",
                "type":"会社"
            },
            {
                "address":"東京都○区△町1-2-3",
                "type":"自宅"
            }
        ],
        "firstName":"太郎",
        "lastName":"山田",
        "purchasedID":[
            101,501,701
        ]
    },
    {
        "contactInfos":[
            {
                "address":"神奈川県○区△町1-2-3",
                "type":"自宅"
            }
        ],
        "firstName":"花子",
        "lastName":"佐藤",
        "purchasedID":[
            101,501,701
        ]
    }
]