Skip to content

Instantly share code, notes, and snippets.

@pierre3
Last active February 26, 2018 05:15
Show Gist options
  • Save pierre3/5404088 to your computer and use it in GitHub Desktop.
Save pierre3/5404088 to your computer and use it in GitHub Desktop.
[DynamicJson] JSON 要素の名前(key)部分が不定の場合の変換方法(2)

[DynamicJson] JSON の名前(key)が不定の場合の変換方法について(その2)

ObjectをJSONにシリアライズする

前回 とは逆のパターン、Gistを生成したりする場合にPOSTするJSONの生成方法に関するメモ。

Gist生成用のJSON

"files"の下に、 " ファイル名 " : { "content": " ファイルの内容 " } を1つ以上含むオブジェクトを設定します。
やはり、" ファイル名 "の部分が不定となります。

{
  "description": "the description for this gist",
  "public": true,
  "files": {
    "file1.txt": {
      "content": "String file1 contents"
    },
    "file2.txt": {
      "content": "String file2 contents"
    }
  }
}

DynamicJsonでシリアライズ

filesのインデクサでアクセスして値を代入(NG)

dynamic _result = new DynamicJson();
_result.description ="the description for this gist";
_result.@public = "true";
_result.files["file1.txt"] = new { content = "String file1 contents" };
_result.files["file2.txt"] = new { content = "String file2 contents" };
var json = _result.Tostring();

=> DynamicJsonにfilesの定義がありません。とおこられます。

files のみをDynamicにして、Objectを生成後シリアライズ (NG)

dynamic _files = new DynamicJson();
_files["file1.txt"] = new { content = "String file1 contents"};
_files["file2.txt"] = new { content = "String file2 contents" };
var gistObj = new
{
    description = "the description for this gist",
    @public = "true",
    files = _files
};
string json = DynamicJson.Serialize(gistObj);

=> DynamicJsonのプロパティがアイテムに入ってしまいます。

{
    "description":"the description for this gist",
    "public":true,
    "files":{
        "IsObject":true,
        "IsArray":false
    }
}

一旦、files に空のオブジェクトを設定後、インデクサに代入 (OK!)

dynamic _result = new DynamicJson();
_result.description ="the description for this gist";
_result.@public = "true";
_result.files = new { }; //空のオブジェクトを生成!
_result.files["file1.txt"] = new { content = "String file1 contents" };
_result.files["file2.txt"] = new { content = "String file2 contents" };
var json = _result.Tostring();

=> これで欲しかったJSONが手に入ります

{
  "description": "the description for this gist",
  "public": true,
  "files": {
    "file1.txt": {
      "content": "String file1 contents"
    },
    "file2.txt": {
      "content": "String file2 contents"
    }
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment