はじめに
ASP.NETなどではAPIコントローラーでjsonを返す際にNewtonsoft.Jsonが使用されています
あまり意識せずに使用していましたが、jsonのパースや値の取得など様々な使い方ができます
基本的な使い方
通常はシリアライズとデシリアライズで事足りるでしょう
シリアライズ
var json = JsonConvert.SerializeObject(new {Name = "名前", Address = "住所"});
// {"Name":"名前","Address":"住所"}
プロパティ名の頭文字を小文字にするには下記のようにします
var json = JsonConvert.SerializeObject(new {Name = "名前", Address = "住所"}, new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
// {"name":"名前","address":"住所"}
デシリアライズ
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>("{\"name\":\"名前\",\"address\":\"住所\"}");
高度な使い方
デシリアライズは型がわかっている場合に使用できますが、どんなオブジェクトになるかわからない場合はパースして解析することができます
パース
var obj = JObject.Parse("{\"name\":\"名前\",\"address\":\"住所\"}");
プロパティの取得
nameの値を取得する場合
var name = obj["name"].ToString();
// 型を指定して下記のようにも取得できます
// var name = obj["name"].Value<string>();
プロパティの値が配列の場合
var obj = JObject.Parse("{\"numbers\":[ 1, 2, 3, 4 ]}");
var numbers = obj["numbers"].Select(n => n.Value<int>()).ToArray();
複雑なjsonの例
下記のようなjsonを想定します
{
"users": [
{
"name": "山田",
"age": 20
},
{
"name": "佐藤",
"age": 24
}
]
}
まずusersを取得しループでnameとageを取得します
var obj = JObject.Parse(json); // 変数jsonの値は上記json
foreach (var user in obj["users"])
{
var name = user["name"].Value<string>();
var age = user["age"].Value<int>();
}
おわりに
不定のjsonを受け付け、特定のプロパティ値を取得するような機会はなかなか無いとは思いますが、単純にデシリアライズできない場合のための参考になればと思います