kintone C# で  Newtonsoft.Json メモ

#C# で kintone Json
C# の kintone Json で使えるライブラリについて、メモしておきます。

これまでは、miniJson ライブラリを使っていましたが、Newtonsoft.Json がよさそうなので使用方法を確認

#プロジェクトへの導入方法
Visual Studio 2015 の NuGet パッケージマネージャーで、json を検索すると先頭に表示されます。
2016/5月時点で、38.7M のダウンロード件数があり、Json のライブラリとして一番使用されています。

#取得コードサンプル

```
using Newtonsoft.Json;
...

// Json文字列の取得 テキストを読み込むだけなので、処理は省略
string strJson = getJsonString();

// Json変換
dynamic j1 = JsonConvert.DeserializeObject(strJson);

// 項目の参照
Console.WriteLine("T1:" + j1.record.文字列__1行);
//T1:{
//  "type": "SINGLE_LINE_TEXT",
//  "value": "テスト"
//}

Console.WriteLine("T2:" + j1["record"]["文字列__1行"]);
//T2:{
//  "type": "SINGLE_LINE_TEXT",
//  "value": "テスト"
//}

Console.WriteLine("T3:" + j1["record"]["文字列__1行"].value);
//T3:テスト

//Console.WriteLine("T4:" + j1["record"].$id.value);
// 「.$id」 は、指定できない

Console.WriteLine("T5:" + j1["record"]["$id"].value);
//T5:1


// 配列（サブテーブル）
foreach (var row in j1.record.Table.value)
{
    Console.WriteLine("A1:" + row);
    // A1:{
    //   "id": "33347",
    //   "value": {
    //     "ルックアップ": {
    //       "type": "SINGLE_LINE_TEXT",
    //       "value": ""
    //     },
    //     "テーブル文字列": {
    //       "type": "SINGLE_LINE_TEXT",
    //       "value": "テスト"
    //     },
    //     "テーブル数値": {
    //       "type": "NUMBER",
    //       "value": "1000"
    //     }
    //   }
    // }

    Console.WriteLine("A2:" + row.value.テーブル文字列.value);
    // A2:テスト

    var subtable = row.value;
    Console.WriteLine("A3:" + subtable.テーブル文字列);
    // A3:{
    //   "type": "SINGLE_LINE_TEXT",
    //   "value": "テスト"
    // }
}


// 配列（サブテーブル）
for (int i = 0; i < j1.record.Table.value.Count; i++)
{
    Console.WriteLine("B1:" + j1.record.Table.value[i].value.テーブル文字列.value);
    // B1:テスト

    var subtable = j1.record.Table.value[i].value;
    Console.WriteLine("B2:" + subtable.テーブル文字列);
    // B2:{
    //   "type": "SINGLE_LINE_TEXT",
    //   "value": "テスト"
    // }
}
```

#使用するJson 
[REST API レコードの取得](https://cybozudev.zendesk.com/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-)から抜粋したものをサンプルとして使います。

```
{
    "record": {
        "文字列__1行": {
            "type": "SINGLE_LINE_TEXT",
            "value": "テスト"
        },
        "文字列__複数行": {
            "type": "MULTI_LINE_TEXT",
            "value": "テスト\nテスト2"
        },
        "$id": {
            "type": "__ID__",
            "value": "1"
        },
        "$revision": {
            "type": "__REVISION__",
            "value": "7"
        },
        "Table": {
            "type": "SUBTABLE",
            "value": [
                {
                    "id": "33347",
                    "value": {
                        "ルックアップ": {
                            "type": "SINGLE_LINE_TEXT",
                            "value": ""
                        },
                        "テーブル文字列": {
                            "type": "SINGLE_LINE_TEXT",
                            "value": "テスト"
                        },
                        "テーブル数値": {
                            "type": "NUMBER",
                            "value": "1000"
                        }
                    }
                },
                {
                    "id": "33354",
                    "value": {
                        "ルックアップ": {
                            "type": "SINGLE_LINE_TEXT",
                            "value": ""
                        },
                        "テーブル文字列": {
                            "type": "SINGLE_LINE_TEXT",
                            "value": "テスト2"
                        },
                        "テーブル数値": {
                            "type": "NUMBER",
                            "value": "2000"
                        }
                    }
                }
            ]
        },
        "作成日時": {
            "type": "CREATED_TIME",
            "value": "2014-02-16T08:59:00Z"
        },
        "更新日時": {
            "type": "UPDATED_TIME",
            "value": "2014-02-17T02:35:00Z"
        },
        "レコード番号": {
            "type": "RECORD_NUMBER",
            "value": "1"
        },
        "添付ファイル": {
            "type": "FILE",
            "value": [
                {
                    "contentType": "image/png",
                    "fileKey": "20140216085901A05579B4196F4968AE26262EE889BD58086",
                    "name": "2014-01-30_No-0001.png",
                    "size": "30536"
                }
            ]
        }
    }
}
```

#項目の参照
・ フィールドコードをそのまま指定するか["フィールドコード"]で指定します。
j1.record.文字列__1行
j1["record"]["文字列__1行"].value

・ \$付きの項目は、["\$id"]のように指定します。
j1["record"]["$id"].value

・ 配列（サブテーブル）
foreach, for のどちらでもループ処理を記述できます。

foreach (var row in j1.record.Table.value)
for (int i = 0; i < j1.record.Table.value.Count; i++)

配列の要素数は、Count で取得します。

#オブジェクトの種類

- Newtonsot.Json.Linq.JObject : Jsonオブジェクト対応
- Newtonsot.Json.Linq.JArray : 配列対応
- Newtonsot.Json.Linq.JValue : Json の値対応

ウォッチで型を参照
![image](https://qiita-image-store.s3.amazonaws.com/0/100572/2024e3b1-7948-7c27-20ee-71e8d60b6a52.png)

#Json処理中の例外メッセージ
下記のメッセージが標準出力に出力されます。
ちょっと気になりますが、とりあえず実行結果は正常のようです。

```
例外がスローされました: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' (Microsoft.CSharp.dll の中)
```


#Json の組み立て方法

地道に項目を追加する方法と、linq を使って追加する方法があります。
kintone のレコード登録を行うjSON を作ってみます。

#項目を順番に追加
```
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
...

// レコード登録1
dynamic j1 = new JObject();
j1.app = 100;

j1.record = new JObject();
j1.record.文字列__1行 = new JObject();
j1.record.文字列__1行.value = "テスト";

j1.record.Add("文字列__複数行", new JObject());
j1.record["文字列__複数行"].Add("value", "テスト\nテスト2");

// テーブル
j1.record.Table = new JObject();
j1.record.Table.value = new JArray();

// テーブル行1
dynamic st1 = new JObject();
st1.value = new JObject();
st1.value.テーブル文字列 = new JObject();
st1.value.テーブル文字列.value = "テスト1";

j1.record.Table.value.Add(st1);

// テーブル行2
dynamic st2 = new JObject();
st2.value = new JObject();
st2.value.テーブル文字列 = new JObject();
st2.value.テーブル文字列.value = "テスト2";

j1.record.Table.value.Add(st2);

Console.WriteLine("T1:"+ j1);
// T1:{
//   "app": 100,
//   "record": {
//     "文字列__1行": {
//       "value": "テスト"
//     },
//     "文字列__複数行": {
//       "value": "テスト\nテスト2"
//     },
//     "Table": {
//       "value": [
//         {
//           "value": {
//             "テーブル文字列": {
//               "value": "テスト1"
//             }
//           }
//         },
//         {
//           "value": {
//             "テーブル文字列": {
//               "value": "テスト2"
//             }
//           }
//         }
//       ]
//     }
//   }
// }

```


#linq で追加
サブテーブルをlinq で追加してみます。
サブテーブルに複数項目を設定する場合は、クラスのリストを準備して linq で組み立てます。

```
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
...

// レコード登録2
dynamic j2 = new JObject(
        new JProperty("app",100),
        new JProperty("record",
            new JObject(
                new JProperty("文字列__1行",
                    new JObject(
                        new JProperty("value", "テスト"))
                    ),
                new JProperty("文字列__複数行",
                    new JObject(
                        new JProperty("value", "テスト\nテスト2"))
                    ),
                new JProperty("Table",
                    new JObject(
                        new JProperty("value", 
                            new JArray(
                                from p in new string[] { "テスト1", "テスト2" }
                                select new JObject(
                                    new JProperty("value",
                                        new JObject(
                                            new JProperty("テーブル文字列",
                                                new JObject(
                                                    new JProperty("value", p)
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
);

Console.WriteLine("T2:" + j2);
// T2:{
//   "app": 100,
//   "record": {
//     "文字列__1行": {
//       "value": "テスト"
//     },
//     "文字列__複数行": {
//       "value": "テスト\nテスト2"
//     },
//     "Table": {
//       "value": [
//         {
//           "value": {
//             "テーブル文字列": {
//               "value": "テスト1"
//             }
//           }
//         },
//         {
//           "value": {
//             "テーブル文字列": {
//               "value": "テスト2"
//             }
//           }
//         }
//       ]
//     }
//   }
// }
```