3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kintone C# で Newtonsoft.Json メモ

Last updated at Posted at 2016-05-07

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 レコードの取得から抜粋したものをサンプルとして使います。

{
    "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

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"
//             }
//           }
//         }
//       ]
//     }
//   }
// }
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?