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 の値対応
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"
// }
// }
// }
// ]
// }
// }
// }