C#でJSONのシリアライズ/デシリアライズができるライブラリ「DataContractJsonSerializer」。
「そういえば、配列が入ったJSONだとどうなるんだ?」
と思い、試してみました!
結論
結論から言うと、やることは変わらないです。
前回からちょっと変えてあげれば、もう配列に対応できます。
シリアライズ
クラス配列を使った一例です。
このように、クラスを単品で使用した時と代わりありません。
public string Serialize(Data[] datas) { string json = ""; using ( var ms = new MemoryStream() ) using ( var sr = new StreamReader(ms) ) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Data[])); serializer.WriteObject(ms, datas); ms.Position = 0; json = sr.ReadToEnd(); WriteLine($"{json}"); } return json; }
クラス配列でなくても
- List
のように、List型でも同様です。
「Data[]」のように書かれている箇所を、「List」のように変えてあげればOKです。
この2箇所ですね。
public string Serialize(Data[] datas)
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Data[]));
作成されたJSONはこのようになります。
[{"name":"solt","size":10,"type":1},{"name":"oil","size":5,"type":2},{"name":"coffee","size":30,"type":3}]
デシリアライズ
こちらもクラス配列を使用した一例です。
結果が配列なので、表示をループ化しているところ以外は、シリアライズ同様、単品と代わりありません。
public void Deserialize(string json) { using ( var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)) ) { var sr = new DataContractJsonSerializer(typeof(Data[])); var datas = (Data[])sr.ReadObject(ms) as Data[]; foreach ( var data in datas ) { Console.WriteLine("type=" + data.type + ", name=" + data.name + ", size=" + data.size); } } }
シリアライズ同様、「Data[]」のように書かれている箇所を、「List」のように変えてあげれば、Listも対応できます。
具体的には、この2行です。
var sr = new DataContractJsonSerializer(typeof(Data[])); var datas = (Data[])sr.ReadObject(ms) as Data[];
結果はこのように表示されました。
type=3, name=short, size=2 type=2, name=uchar, size=1 type=11, name=float, size=4
あとがき
C#で、DataContractJsonSerializerを使って、配列が入ったJSONを、シリアライズ/デシリアライズする方法でした!
実は試してみて、「いや、普通にやるのと変わらないんかい……」となったので、記事にするか迷いました……
でも、自分が「どうなんだう」と思ったので、記録として残しました。
コレを見て、ぼく同様
「いや、普通にやるのと変わらないんかい……」
となった方。
これで記憶に定着しますね!(笑)
DataContractJsonSerializerの使い方についての記事はコチラ。