MS_JSONParseExperiments - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒJSONïŒ
- JSONãéä¿¡ããRESTãµãŒãã¹ãäœæããæ¹æ³
- JSONãåä¿¡ããJSON-RPCãµãŒãã¹ãäœæããæ¹æ³
- JSONã®parseãè²ã 詊ããŠã¿ãã
ãšããæ¡ä»¶ã®èŠä»¶ã§ã
éæ§é åããŒã¿ãç²å现工ã®ããã«
ãŽãªãŽãªãšåŠçããããããããã£ãããšã¯ãå¯èœãªã®ã ãããïŒ
ãšããããšã調æ»ããã
çµè«ãšããŠã¯ãã³ãã©ã® LINQ to JSON ã䜿çšããããšã§å¯èœã
è£è¶³ïŒæ¬ããŒãžã®æ§æïŒ: æ€èšŒèšé²ã®ããé·ããã
è«æšã¯äžæ¬éã§ãããâ JSON ã«åãããŠã¯ã©ã¹ãå®çŸ©ããïŒåºæ¬ïŒ â â¡ åãç¹å®ã§ããæ§é ãªããJSON.NET ãå šéšãã£ãŠããã â ⢠ãåãç¹å®ã§ããªãæ§é ãã ãš POCO ã«ãããã§ããªã â ⣠ãã®å Žå㯠JObjectïŒLINQ to JSONïŒã§æåã§æ±ã â çµè«ã€ãŸãã**ãéçãªåä»ããã§ããªã JSON ãã©ãæ±ããã**ãšãã
äžè²«ããåãã«å¯Ÿãã調æ»èšé²ã§ããã
ãŸããã©ã®ãããªãã©ãŒãããã® JSON ãåºåãããã®ãã確èªããã
次ã«ãåºåããã JSON ã«åãããŠãã¯ã©ã¹ãå®çŸ©ããã
è£è¶³: ãã®é åºïŒJSON ãå ãã¯ã©ã¹ãåŸïŒãéèŠã§ã
JSONãéä¿¡ããRESTãµãŒãã¹ãäœæããæ¹æ³ã®
ãJSON ãã©ãŒãããããã³ã³ãã©ã¯ããšããããšåã䞻匵ã§ããã
åºæ¬çã«ã¯ã以äžã®ã«ãŒã«ã«åŸã£ãŠãã¯ã©ã¹ã»ããããã£ãå®çŸ©ããã
- JSON ãªããžã§ã¯ãïŒ
{ ããŒå : å€ }ïŒã®å Žå- ãããŒåããååã«æã€ããããã£ãå®çŸ©ãã
- JSON é
åïŒ
[ å€ïŒ, å€ïŒ, ... ]ïŒã®å Žå- ãªã¹ããŸãã¯é åã®ããããã£ãå®çŸ©ãã
- ããŒåãäžå®ã®å Žå
- ããŒåãäžå®ïŒå®è¡æã«æ±ºãŸãïŒã®å Žåãäºåã®ã¯ã©ã¹ïŒããããã£å®çŸ©ãã§ããªãã
- ãã®ãããªãšãã¯ã
Dictionary<TKey, TValue>ããDictionary<string, object>ãšããŠå®çŸ©ããã
åºæ¬çã«ã以äžã®ããã« JSON åºåãæ³å®ããã¯ã©ã¹ãå®çŸ©ããã
| # | åºåããã JSON | å®çŸ©ããã¯ã©ã¹ã»ãããã㣠|
|---|---|---|
| 1 | { "key1" : "value1", "key2" : "value2" } |
public class Sample{ãã string key1 { get; set; }ãã string key2 { get; set; }}è¥ããã¯ã Dictionary<string, string> dic;
|
| 2 | [ "1", "2", "3" ] |
List<string> listData { get; set; }
|
| 3 | { "key1" : [ "1", "2", "3" ] } |
public class Sample{ãã List<string> key1 { get; set; }}
|
| 4 | { "key" : { "key1" : "value1", "key2" : "value2" } } |
public class Sample{ãã string key1 { get; set; }ãã string key2 { get; set; }}public class Sample2{ãã Sample key { get; set; }}è¥ããã¯ã Dictionary<string, Sample> dic;è¥ããã¯ã Dictionary<string, Dictionary<string, string>> dic;
|
| 5 |
[ { "key1" : "value1", "key2" : "value2" },{ "key1" : "value3", "key2" : "value4" } ]
|
public class Sample{ãã string key1 { get; set; }ãã string key2 { get; set; }}List<Sample> list;
|
- è£è¶³
- ãã ããDictionary ã DataContractJsonSerializer ã§
ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºããå Žåãäžèšã®æ§ã«ãçžäºéçšæ§ã«åé¡ãããã®ã§æ³šæããã - äžèšã®ããã«ã
public class Sampleãå®çŸ©ããã®ãé¢åãªå Žåã¯ã
以äžã®ããã«ãå¿ååã䜿çšããããšã§ãç°¡åã« JSON ãäœæããããšãã§ããã
- ãã ããDictionary ã DataContractJsonSerializer ã§
JsonConvert.SerializeObject(new
{
date = DateTime.Now,
command = SqlExecuteType.Reader,
text = this.ClearText(this._commandText),
param = this._commandParameters,
ms = this._stopwatch.ElapsedMilliseconds
}, Formatting.None));è£è¶³ïŒå¿ååãæå¹ãªå Žé¢ïŒ: å¿ååã¯
**ãäžåºŠããã®ãè¿ãã ãã® JSONã**ã«éåžžã«æå¹ã§ããã
å Žé¢ è©äŸ¡ ãã°åºåããããã°æ å ± æé©ïŒäžã®ã³ãŒãäŸããŸãã«ããïŒ åçºã® API ã®å¿ç æå¹ å ¬é API ã®å¿ç éæšå¥šïŒå¥çŽãåãšããŠæ®ããªãïŒ 3 ã€ç®ãèŠç¹ã§ãå¿ååã¯
ãã©ã㪠JSON ãè¿ã API ãªã®ãããã³ãŒãäžã«å®çŸ©ãšããŠæ®ããªãã
JSONãéä¿¡ããRESTãµãŒãã¹ãäœæããæ¹æ³ã§è¿°ã¹ã
ã¹ããŒã ãã¡ãŒã¹ãã®èгç¹ã§ã¯ã
å ¬éãã API ã§ã¯æç€ºçãªã¯ã©ã¹ïŒDTOïŒãå®çŸ©ãã¹ãã§ããããªããC# 9 以éã¯
recordã䜿ããš
å¿ååã«è¿ãç°¡æœãã§ååä»ãã®åãå®çŸ©ã§ããã
Visual Studio ã®æ¡åŒµæ©èœã§ãããWeb Essentials ã䜿ããšãJSON ããã¯ã©ã¹ãèªåçæã§ããã
Web Essentials ã¯ãVisual Studio ã®ã¡ãã¥ãŒãããããŒã«ïŒœ-æ¡åŒµæ©èœãšæŽæ°ããã°ã©ã ã§è¿œå ã§ããã

JSON æååãã³ããŒããVisual Studio ã®ãšãã£ã¿ãŒã§ãå³ã¯ãªãã¯ãŸãã¯ïŒ»ç·šéã¡ãã¥ãŒããã
圢åŒãéžæããŠè²Œãä»ã-JSON ãã¯ã©ã¹ãšããŠè²Œãä»ãããéžæãããšã
ãã® JSON ãã©ãŒãããã«åã£ãã¯ã©ã¹ãçæãããã
è£è¶³ïŒææ°åïŒæ¡åŒµæ©èœãªãã§äœ¿ããïŒ: ãã®æ©èœã¯
Visual Studio 2013 以éãæšæºæ©èœãšããŠçµã¿èŸŒãŸããŠããã
Web Essentials ã远å ããå¿ èŠã¯ç¡ãã線éâ圢åŒãéžæããŠè²Œãä»ã ââ JSON ãã¯ã©ã¹ãšããŠè²Œãä»ãã ââ XML ãã¯ã©ã¹ãšããŠè²Œãä»ããJSON ãã¯ãªããããŒãã«ã³ããŒããç¶æ ã§ãªããšã¡ãã¥ãŒãåºãªã
ç¹ã«æ³šæããããªããçæãããã¯ã©ã¹ã¯
- ããããã£åã
RootobjectãClass1ãšãã£ãæ©æ¢°çãªååã«ãªããnullã®é ç®ã¯objectåã«ãªãã- æ°å€ã
intã«ãªãïŒå®éã«ã¯longãdecimalãå¿ èŠãããããªãïŒãããçæåŸã«æã§èª¿æŽããåæã§äœ¿ãã®ãæ£ããã
ããããå°ãäœããéå ·ã§ããã
ã³ã³ãåèã«ãªãã
- C# ã§ JSON ãæ±ãã©ã€ãã©ãªãJson.NETãã䜿ã£ãŠã¿ãŸãã - Qiita
http://qiita.com/ta-yamaoka/items/a7ff1d9651310ade4e76
[JsonObject("aaa")]
public class AAA
{
[JsonProperty("prop1")]
public int Property1 { get; set; }
[JsonProperty("prop2")]
public string Property2 { get; set; }
}-
ã·ãªã¢ã©ã€ãº
-
ã³ãŒã
AAA aaa = new AAA(); aaa.Property1 = 100; aaa.Property2 = "xxx"; string json = JsonConvert.SerializeObject(aaa);
-
æåå
{"prop1":100,"prop2":"xxx"}
-
-
ãã·ãªã¢ã©ã€ãº
-
åãæå®ããŠãã·ãªã¢ã©ã€ãº
-
ã³ãŒã
AAA åã«ãã·ãªã¢ã©ã€ãºããããAAA aaa = JsonConvert.DeserializeObject<AAA>(json);
-
-
åãæå®ããã«ãã·ãªã¢ã©ã€ãº
-
ã³ãŒã
JObjectåã«ãã·ãªã¢ã©ã€ãºããããJObject jobj = (JObject)JsonConvert.DeserializeObject(json);
-
-
-
åè
- JsonConvert.SerializeObject Method
http://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_JsonConvert_SerializeObject.htm - JsonConvert.DeserializeObject Method
http://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_JsonConvert_DeserializeObject.htm
- JsonConvert.SerializeObject Method
ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºã®ã¡ãœããã«ã
ããæ¹æ³ãããã
-
ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºæã«ã
ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºã®æ¢å®å€ãå¶åŸ¡ãã
ãªããžã§ã¯ãïŒJsonSerializerSettingsïŒãæå®ã§ããã-
ã·ãªã¢ã©ã€ãºæã«æå®
string json = JsonConvert.SerializeObject(aaa, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate });
-
ãã·ãªã¢ã©ã€ãºæã«æå®
AAA aaa = JsonConvert.DeserializeObject<UserModel>(jsonstring, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate });
-
-
Handling
- DefaultValueHandling
- Include
ã·ãªã¢ã©ã€ãºæã«æ¢å®å€ã®é ç®ã JSON ã«å«ããïŒæ¢å®ïŒã - Ignore
ã·ãªã¢ã©ã€ãºæã«æ¢å®å€ã®é ç®ã JSON ã«å«ããªãã - Populate
ãã·ãªã¢ã©ã€ãºæã« JSON æååäžã«èŠçŽ ãååšããªãå Žåã§ãæ¢å®å€ãèšå®ã - IgnoreAndPopulate
Ignore ãš Populate ã®åææå®ã
- Include
- NullValueHandling
null ã®å€ãã©ãåŠçããã- Include
ãªããžã§ã¯ããã·ãªã¢ã©ã€ãºããã³ãã·ãªã¢ã©ã€ãºãããšãã«ã¯ãnull å€ãå«ããŸãã - Ignore
ãªããžã§ã¯ãã®ã·ãªã¢ã©ã€ãºããã³ãã·ãªã¢ã©ã€ãºæã«ã¯ null å€ãç¡èŠããŸãã
- Include
- MissingMemberHandling
ãã·ãªã¢ã©ã€ãºæãã¡ã³ããååšããªãå Žåã®åäœ- Ignore
ç¡èŠããïŒæ¢å®ïŒ - Error
äŸå€ãåºå
- Ignore
- DefaultValueHandling
-
ContractResolver
- DefaultContractResolver
ã¡ã³ãå㯠PascalCase ã§ JSON åãããã - CamelCasePropertyNamesContractResolver
ã¡ã³ãå㯠CamelCase ã§ JSON åãããã
- DefaultContractResolver
-
Formatting
- None
ã€ã³ãã³ããªã - Indented
ã€ã³ãã³ããã€ãã
- None
è£è¶³ïŒ
MissingMemberHandlingã®æ¢å®å€ããç¡èŠãã§ããæå³ïŒ: ãã®æ¢å®å€ã¯
API ã®ããŒãžã§ã³äºææ§ã«çŽçµãããããæèããŠéžã¶å¿ èŠãããããIgnoreïŒæ¢å®ïŒã ãµãŒããæ°ããé ç®ã远å ãã JSON ãè¿ã â å€ãã¯ã©ã€ã¢ã³ãã¯ç¥ããªãé ç®ããé»ã£ãŠæšãŠãã â åæ¹äºææ§ãããïŒå£ããªãïŒ ãErrorã ç¥ããªãé ç®ããããšäŸå€ â â ãµãŒããé ç®ã 1 ã€è¶³ããã ãã§ã¯ã©ã€ã¢ã³ããå šæ» ããã€ãŸããæ¢å®ã®
Ignoreã API 飿ºã§ã¯æ£ããã
ããã¯ãç¥ããªããã®ã¯ç¡èŠããããšãã
**å ç¢æ§ã®ååïŒPostel ã®æ³åïŒ**ã«æ²¿ã£ãæåã§ãããéã«ãèšå®ãã¡ã€ã«ã®èªã¿èŸŒã¿ãªã©
ãã¿ã€ããã¹ã«æ°ä»ããããå Žé¢ã§ã¯Errorãé©åã«ãªãããªãã**
System.Text.Jsonã§ãæ¢å®ã¯ãç¡èŠã**ã§ããã
- æ§ã
ãªå±æ§ãããã
- JsonProperty 屿§
JSON ã®ããŒãæå®ãã - JsonIgnore 屿§
ã·ãªã¢ã©ã€ãºå¯Ÿè±¡å€ãèšå®ãã - DefaultValue 屿§
æ¢å®å€ãèšå®ããã - , etc.
Serialization Attributes
https://www.newtonsoft.com/json/help/html/SerializationAttributes.htm
- JsonProperty 屿§
- 屿§ã®èšå®æ¹æ³
[JsonObject("aaa")]
public class AAA
{
[JsonProperty("prop1")]
public int Property1 { get; set; }
[JsonProperty("prop2")]
[DefaultValue("hogehoge")]
public string Property2 { get; set; }
[JsonIgnore]
public string Property3 { get; set; }
}- JsonProperty 屿§ã«ã¯ãæŽã«æ§ã ãªããããã£ãèšå®å¯èœã
[JsonProperty("prop2", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue("hogehoge")]
public string Property2 { get; set; }è£è¶³ïŒ
JsonIgnoreã¯ã»ãã¥ãªãã£äžãéèŠïŒ:JsonIgnoreã¯
ãäžèŠãªé ç®ãçããã ãã§ãªãã
æ©å¯æ å ±ãå¿çã«æŒãããªãããã®ææ®µã§ããããpublic class User { public string Id { get; set; } public string Name { get; set; } [JsonIgnore] // â ãããç¡ããš API å¿çã«èŒã public string PasswordHash { get; set; } }ãã ãããä»ãå¿ããã«äŸåããèšèšã¯å±éºã§ããã
ãã確å®ãªã®ã¯ã
ææ®µ å 容 DTO ãåãã ãšã³ãã£ãã£ããã®ãŸãŸè¿ããªããå¿çå°çšã®ã¯ã©ã¹ãäœã JsonIgnoreè£å©çã« ãšã³ãã£ãã£ïŒDB ã®ã¢ãã«ïŒããã®ãŸãŸ API ã§è¿ãèšèšã¯ã
æ°ããåã远å ããç¬éã«ãããå€éšã«é²åºããããã
å ¬é API ã§ã¯é¿ããã®ãååã§ããã
äžèšã®ãªã³ã¯å ã®èšäºã«
ãéå±€æ§é ãæã£ã JSON ã§ãåé¡ãªããã·ãªã¢ã©ã€ãºå¯èœã
JSON é åã List ãªã©ã«ããŒã¹ããŠããããã
ãšããããäœåŠãŸã§ãã£ãŠããããïŒ
ã»ã»ã»æ€èšŒã®çµæã
- åãç¹å®ã§ããæ§é ã® JSON ã¯ã·ãªã¢ã©ã€ãºã§ããã
-
åãç¹å®ã§ããªãæ§é ã® JSONã¯ãã·ãªã¢ã©ã€ãºã¯å¯èœã ãã
ãã·ãªã¢ã©ã€ãºçµæã¯ïŒã€ã³ãã¯ãµã䜿çšå¯èœãªïŒJObjectã«æ ŒçŽãããã
ãšããããšãè§£ã£ãã
以äžã¯ãåãç¹å®ã§ããæ§é ã® JSON ã parse ããäŸã
- åãæç€º
- Bean, POCO
[JsonObject("aaa")]
public class AAA
{
[JsonProperty("prop1")]
public int Property1 { get; set; }
[JsonProperty("prop2")]
public string Property2 { get; set; }
[JsonProperty("prop3")]
public AAA Property3 { get; set; }
}- ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãº
static void Main(string[] args)
{
AAA aaa = new AAA();
aaa.Property1 = 100;
aaa.Property2 = "xxx";
aaa.Property3 = new AAA();
aaa.Property3.Property1 = 200;
aaa.Property3.Property2 = "yyy";
string json = JsonConvert.SerializeObject(aaa);
Console.WriteLine(json);
aaa = JsonConvert.DeserializeObject<AAA>(json);- åãæç€ºããªã
ãªããžã§ã¯ãåã䜿çšããïŒJObject åã«ãã·ãªã¢ã©ã€ãºãããïŒã- Bean, POCO
[JsonObject("aaa")]
public class AAA
{
[JsonProperty("prop1")]
public int Property1 { get; set; }
[JsonProperty("prop2")]
public string Property2 { get; set; }
[JsonProperty("prop3")]
public object Property3 { get; set; }
}- ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãº
static void Main(string[] args)
{
AAA aaa1 = new AAA();
AAA aaa2 = new AAA();
aaa1.Property1 = 100;
aaa1.Property2 = "xxx";
aaa2.Property1 = 200;
aaa2.Property2 = "yyy";
aaa1.Property3 = aaa2;
string json = JsonConvert.SerializeObject(aaa1);
Console.WriteLine(json);
JObject jobj = (JObject)JsonConvert.DeserializeObject(json);- Primitive åãš Generic åã®ç¯å²ã§ããã°ãJSON ã®åãç¹å®ã§ããã®ã§ãparse ã§ããã
- ãã®ãããPrimitive åãš Generic åã®ç¯å²ã§èªç±ãªæ§é ãçµãããšãã§ããã
- ããããGeneric ã§ã¯ãBean, POCO ã䜿çšããããïŒãã£ãŒã«ãåã»ãã£ãŒã«ãåã®çµã¿åãããïŒèªç±ãªæ§é ãçµããªãã
static void Main(string[] args)
{
List<Dictionary<string, string>> parent = new List<Dictionary<string, string>>();
Dictionary<string, string> child;
child = new Dictionary<string, string>();
child["aaa"] = "AAA";
child["bbb"] = "BBB";
child["ccc"] = "CCC";
parent.Add(child);
child = new Dictionary<string, string>();
child["xxx"] = "XXX";
child["yyy"] = "YYY";
child["zzz"] = "ZZZ";
parent.Add(child);
string json = JsonConvert.SerializeObject(parent);
Console.WriteLine(json);
parent = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(json);åŸã£ãŠãList<POCO> çãšèšã£ããGeneric ïŒ POCO ãåé¡ãªãåŠçã§ããã
- åŠç
- Bean, POCO
[JsonObject("aaa")]
public class AAA
{
[JsonProperty("prop1")]
public int Property1 { get; set; }
[JsonProperty("prop2")]
public string Property2 { get; set; }
[JsonProperty("prop3")]
public AAA Property3 { get; set; }
}- ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãº
static void Main(string[] args)
{
AAA aaa1 = new AAA();
AAA aaa2 = new AAA();
aaa1.Property1 = 100;
aaa1.Property2 = "xxx";
aaa2.Property1 = 200;
aaa2.Property2 = "yyy";
aaa1.Property3 = aaa2;
List<AAA> lstaaa = new List<AAA>();
lstaaa.Add(aaa1);
lstaaa.Add(aaa2);
string json = JsonConvert.SerializeObject(lstaaa);
Console.WriteLine(json);
lstaaa = JsonConvert.DeserializeObject<List<AAA>>(json);- 掟çåãã·ãªã¢ã©ã€ãºã§ããããåé¡ã¯æŽŸçåã«ãã·ãªã¢ã©ã€ãºã§ããªãããšã
ïŒç¶æ¿ã¯ã©ã¹ã®ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãåºåºã¯ã©ã¹ã§ãã³ãã«ããããšããå ŽåïŒ- ãã€ããªã»ã·ãªã¢ã©ã€ãºã§ã¯ããããããšãã§ããããããã¯åæ å ±ãæãããŠããããã
- åæ å ±ãæããªã JSON ã®ã·ãªã¢ã©ã€ãºã§ã¯ãããããããšã¯ã§ããªãã
- DataContractJsonSerializer ã§ã¯åæ
å ±ã®åºåãªã©ããµããŒããããŠãããã
æšä»ã®çžäºéçšæ§ãéèŠããã JSON å©ç𿹿³ãèãããšããã䜿ãããªãæ©èœã«ãªã£ãã- .net - How do I tell DataContractJsonSerializer to not include the "__type" property - Stack Overflow
https://stackoverflow.com/questions/17815772/how-do-i-tell-datacontractjsonserializer-to-not-include-the-type-property
- .net - How do I tell DataContractJsonSerializer to not include the "__type" property - Stack Overflow
- åŠç
- Bean, POCO
[JsonObject("aaa")]
public class AAA
{
[JsonProperty("prop1")]
public int Property1 { get; set; }
[JsonProperty("prop2")]
public string Property2 { get; set; }
[JsonProperty("prop3")]
public AAA Property3 { get; set; }
}
[JsonObject("bbb")]
public class BBB : AAA
{
[JsonProperty("prop4")]
public int Property4 { get; set; }
}
[JsonObject("ccc")]
public class CCC : AAA
{
[JsonProperty("prop4")]
public string Property4 { get; set; }
}- ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãº
static void Main(string[] args)
{
AAA aaa1 = new AAA();
AAA aaa2 = new AAA();
aaa1.Property1 = 100;
aaa1.Property2 = "xxx";
aaa1.Property3 = new BBB(); // AAAã®æŽŸçã®BBB
aaa2.Property1 = 200;
aaa2.Property2 = "yyy";
aaa2.Property3 = new CCC(); // AAAã®æŽŸçã®CCC
List<AAA> lstaaa = new List<AAA>();
lstaaa.Add(aaa1);
lstaaa.Add(aaa2);
string json = JsonConvert.SerializeObject(lstaaa);
Console.WriteLine(json);
// BBBãšCCCãAAAåã®Property3ãã£ãŒã«ãã«ãã·ãªã¢ã©ã€ãºãããªãã
lstaaa = JsonConvert.DeserializeObject<List<AAA>>(json);è£è¶³ïŒãã®ã掟çåã®åé¡ããæ¬ããŒãžã®æ žå¿ã®ã²ãšã€ïŒ: æ€èšŒçµæã®
ãåæ å ±ãæããªã JSON ã®ã·ãªã¢ã©ã€ãºã§ã¯ãããããããšã¯ã§ããªãããšãã
çµè«ã¯æ£ç¢ºã§ããããã€éèŠãªèšèšäžã®å«æãæã€ãããã€ã㪠ã·ãªã¢ã©ã€ãºïŒBinaryFormatter çïŒã "ååãå«ã" ã®ã§ãåŸ©å æã«å ã®ã¯ã©ã¹ã«æ»ãã â ããã ãä»»æã®åã埩å ã§ãã ïŒ æ»æè ãä»»æã®åãäœãããããã â é倧ãªè匱æ§ïŒãã·ãªã¢ã©ã€ãºæ»æïŒ ãJSONã åæ å ±ãæããªã ïŒ åŸ©å å ã®åã¯ãåãåãåŽã決ããã â å®å šã ããæŽŸçåã¯åŸ©å ã§ããªãã€ãŸãããã§ããªããã®ã¯å¶çŽã§ã¯ãªããå®å šåŽã®èšèšã§ããã
å®éãBinaryFormatter㯠.NET 5 ã§éæšå¥šã
.NET 9 ã§åé€ãããïŒãã·ãªã¢ã©ã€ãºæ»æã®ããïŒãã©ãããŠã倿 æ§ãå¿ èŠãªå Žåã®ææ®µã¯æ¬¡ã®ãšããã
ææ®µ å 容 å®å šæ§ å€å¥åïŒdiscriminatorïŒãèªåã§æã€ {"type":"BBB", ...}ãèŠãŠèªåã§åå²ããå®å šïŒæšå¥šïŒ TypeNameHandlingïŒJSON.NETïŒååã JSON ã«åã蟌ã å±éºïŒä»»æã®åãçæããåŸãïŒ [JsonDerivedType]ïŒ.NET 7+ïŒèš±å¯ããæŽŸçåãæç€ºããŠå€æ æ§ãå®çŸ å®å š
TypeNameHandling.Allã¯æ¢ç¥ã®è匱æ§ã§ããã
å€éšããåãåã JSON ã«ã¯çµ¶å¯Ÿã«äœ¿ã£ãŠã¯ãªããªããçŸåšã¯
System.Text.Jsonã®[JsonDerivedType]ïŒ.NET 7 以éïŒã
æ£ããçãã§ãèš±å¯ããåã宣èšçã«éå®ããããã§
倿 çãªã·ãªã¢ã©ã€ãºïŒãã·ãªã¢ã©ã€ãºãã§ããã
ã·ãªã¢ã©ã€ãºã®å¯Ÿè±¡ã« object åã䜿çšããŠããã
ã·ãªã¢ã©ã€ãºã®éã
- ä»»æã®åãæå®ãããã
- åºåããã JSON ã®æ§é ãäžå®ã§ã¯ãªãã
ç§»è¡ã¡ã¢ïŒäœè£ïŒ: åå žã®ãåºåããããããJSONãã¯
ããããããéè€ããŠããããä¿®æ£ããã
以äžã®æ§ãªæ§é ãäžå®ã§ã¯ãªãã±ãŒã¹ã§ã¯ã
ã·ãªã¢ã©ã€ãºã®å¯Ÿè±¡ã« object åã䜿çšããããåŸãªãã
- åèŠçŽ JSON ã®æ§é ãäžå®ã§ã¯ãªãïŒField ã« object åã䜿çšããïŒ
- é
åå
ã® JSON ã®æ§é ãäžå®ã§ã¯ãªãïŒ
object[], Hashtable ã䜿çšããïŒ
åãç¹å®ã§ããªãæ§é ã®ïŒobject åãã·ãªã¢ã©ã€ãºããïŒJSON ã
ãã·ãªã¢ã©ã€ãºãããš JSON ããŒã¿ã¯ JObject åã«æ ŒçŽãããã
ãã®å ŽåãJSON.NET ã® JObject ã® LINQ to JSON ã§åã®æåã®ãã·ãªã¢ã©ã€ãºãè¡ãã
- Json.NET - Newtonsoft
http://www.newtonsoft.com/json
WCFã®æ¢å®ã®ã·ãªã¢ã©ã€ã¶ã
æµè¡ã£ãŠãªãã®ã§åºæ¬ã¹ã«ãŒã ãã
䜿ãå Žåã¯ã以äžã®ç¹ã«æ³šæããã
.NET ã® DataContractJsonSerializer 㯠Java ã JSON.NET ãšãã·ãªã¢ã©ã€ã¶ã®æåãéãã
ãã®ãããåã圢åŒã® POJO ãŸã㯠POCO ã§ãã£ãŠããã·ãªã¢ã©ã€ãºåŸã® JSON ãã©ãŒããããç°ãªãã
ç¹ã«ã以äžã®ããã« Dictionary ã® JSON ã·ãªã¢ã©ã€ãºçµæãç°ãªãã
| # | æè¡ | POJO / POCO ãµã³ãã« | ã·ãªã¢ã©ã€ãºããã JSON |
|---|---|---|---|
| 1 | Java, JSON.NET |
public class Sample {ãã public String _key1;ãã public String _key2;ãã public void setKey1(String key1) { ... }ãã public String getKey1() { ... }ãã public void setKey2(String key2) { ... }ãã public String getKey2() { ... }}
|
{ "key1" : "value1", "key2" : "value2" } |
| 2 | åäž |
public class Sample {ãã public HashMap<String, String> _key;ãã public void setKey(HashMap<String, String> key) { ... }ãã public void getKey() { ... }}
|
{ "key1" : "value1", "key2" : "value2" } |
| 3 | .NET ã® DataContractJsonSerializer |
public class Sample {ãã public string key1 { get; set; }ãã public string key2 { get; set; }}
|
{ "key1" : "value1", "key2" : "value2" } |
| 4 | åäž |
public class Sample {ãã public Dictionary<string, string> key { get; set; }}
|
[ãã {ãããã "Key": "Prop1",ãããã "Value": "Value1"ãã },ãã {ãããã "Key": "Prop2",ãããã "Value": "Value2"ãã }]åã圢åŒã®ãžã§ããªãã¯åã§ãã£ãŠãã 䜿çšãã Serializer 次第ã§ã·ãªã¢ã©ã€ãºçµæãç°ãªã |
ç§»è¡ã¡ã¢ïŒè¡šã®å€æïŒ: åå žã¯ PukiWiki ã®ã»ã«çµåèšæ³ïŒ
~ïŒã§
ãäžã®ã»ã«ãšåããã衚çŸããŠãããããåãå€ãå±éããŠèšèŒããã
ãŸããJava åŽã® getter / setter ã®äžèº«ã¯
å®åçãªå®è£ ã§ãã£ããã{ ... }ã«çç¥ããã
è£è¶³ïŒãã®è¡šã瀺ãåé¡ã®æ·±å»ãïŒ: 4 è¡ç®ãæ¬ããŒãžã§
æãå®åçãªçºèŠã§ããããJava / JSON.NETã Map / Dictionary â { "key1":"value1", "key2":"value2" } â çŽæçãJSON ãªããžã§ã¯ãã«ãªã ãDataContractJsonSerializerã Dictionary â [ {"Key":"key1","Value":"value1"}, {"Key":"key2","Value":"value2"} ] â KeyValuePair ã®ãé åãã«ãªãïŒïŒïŒããããªãèµ·ããããšãããšã
DataContractJsonSerializerã¯
Dictionary<K,V>ããKeyValuePair<K,V>ã®ã³ã¬ã¯ã·ã§ã³ããšããŠ
ãã®ãŸãŸçŽ çŽã«ã·ãªã¢ã©ã€ãºããŠããããã§ããã
.NET ã®å éšæ§é ããã®ãŸãŸ JSON ã«åããçµæã§ããã
JSON ãšããŠã¯äžèªç¶ã ãã.NET ãšããŠã¯äžè²«ããŠãããå®åäžã®åœ±é¿ã¯æ·±å»ã§ã
å Žé¢ äœãèµ·ããã Java åŽãšé£æº åã POCO/POJO ãªã®ã« JSON ãäžèŽããªã JavaScript ããå©çš obj.key1ã§ã¢ã¯ã»ã¹ã§ããªãïŒé åãèµ°æ»ããå¿ èŠïŒåŸããã·ãªã¢ã©ã€ã¶ãå€æŽ JSON ã®åœ¢ãå€ãããæ¢åã¯ã©ã€ã¢ã³ããå£ãã ãããããã
JSONãéä¿¡ããRESTãµãŒãã¹ãäœæããæ¹æ³ã®
**ããããªã POCO ãããŒã¿ã³ã³ãã©ã¯ããšããªãã**ãšãã䞻匵ã®
æ ¹æ ã«ãªã£ãŠããå®äŸã§ããããªãã
System.Text.Json㯠Java / JSON.NET ãšåãæå
ïŒDictionaryã JSON ãªããžã§ã¯ãã«ããïŒã§ããããã
çŸåšãã®åé¡ã«åœããã®ã¯
WCF ã®æ¢å®èšå®ã䜿ã£ãŠããå Žåã«éãããã
ãã®éãã¯ã以äžã®æ©èœã®ãµããŒãç¶æ³ã«ãããã®ãããã
- Efficient dictionary serialization
http://stackoverflow.com/questions/1207731/how-can-i-deserialize-json-to-a-simple-dictionarystring-string-in-asp-net - Nonsensical dictionary serialization
http://stackoverflow.com/questions/4559991/any-way-to-make-datacontractjsonserializer-serialize-dictionaries-properly - åè
- Json.NET - Home
http://json.codeplex.com/ - Json.NET - Newtonsoft
http://www.newtonsoft.com/json
- Json.NET - Home
çµç·¯ãèªãã§ã¿ããšãJSON.NETã«äœãåé¡ããããšãã話ã§ã¯ãªãã
- JSON parse ã®çµèŸŒãµããŒããç¡ãããŸããå€éšäŸåãå€ãããã£ãã
- MS ãäž»äœçã« JSON ã® parse åŠçã®æ§èœåäžãå³ã£ãŠãããããšæã£ãŠãããããã
-
Span<T>ã䜿çšããã - UTF-16 ã«å€æãã UTF-8 ãçŽæ¥åŠçããã
-
- 確å®çãªåäœãéèŠãïŒæšæž¬ãè§£éã¯è¡ãããªãïŒã
ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ã確ä¿ããã
ãšèšãäºã®æ§ã§ãã
è£è¶³ïŒ3 ã€ã®çç±ã®ãã¡ãå€éšäŸåãå€ãããã£ãããæã倧ããïŒ: çµç·¯ãšããŠ
æ£ç¢ºãªæŽçã ãããªãå€éšäŸåãåé¡ã ã£ãã®ããè£è¶³ããããåŸæ¥ãASP.NET Core ã Newtonsoft.Json ã«äŸå â ã¢ããªã Newtonsoft.Json ã䜿ã â ãããŒãžã§ã³ã®è¡çªã ã»ãã¬ãŒã ã¯ãŒã¯ãèŠæ±ããçãšãã¢ããªã䜿ãããçãéã ã»ã©ã€ãã©ãªããšã«èŠæ±ããçãéããã¬ãŒã ã¯ãŒã¯ãç¹å®ã®ãµãŒãããŒãã£è£œã©ã€ãã©ãªã«
äŸåããŠããããšèªäœããå©çšè ã«ãšã£ãŠã®å¶çŽã«ãªã£ãŠããã
æšæºã©ã€ãã©ãªã«åã蟌ãããšã§ããã®åé¡ãè§£æ¶ãããããŸããæ§èœé¢ã®çç±ãå®éã«å€§ããã
èŠ³ç¹ Newtonsoft.Json System.Text.Json æååã®æ±ã UTF-16 ã«å€æããŠããåŠç UTF-8 ã®ãŸãŸåŠç ã¡ã¢ãª æååãéœåºŠç¢ºä¿ Span<T>ã§ç¢ºä¿ãæžããé床 ïŒ æŠã 1.3ã2 åçšåºŠéã HTTP ã®æ¬æã¯å ã UTF-8 ã§ããããã
UTF-16 ãžã®å€æèªäœãç¡é§ã ã£ãããšããã®ãèŠç¹ã§ããã
..ãªã€ãªã€æžãã«ã¢...
- ..ãªã€ãªã€æžãã«ã¢...
- æšæž¬ãè§£éé¢é£ã®æ©èœã¯ãµããŒããããªãã
- åè
- Newtonsoft.Json ãã System.Text.Json ã«ç§»è¡ãã - .NET | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to
- Newtonsoft.Json ãã System.Text.Json ã«ç§»è¡ãã - .NET | Microsoft Docs
è£è¶³ïŒãæšæž¬ãè§£éé¢é£ã®æ©èœã¯ãµããŒããããªããã®å ·äœäŸïŒ: æªèšèŒã®
ç¯ã ãããã®äžè¡ãç§»è¡æã®èºãã©ãããç確ã«äºåããŠããã
System.Text.Jsonã¯å³æ Œã§ããã
Newtonsoft.Json ããæ°ãå©ãããŠããã£ãŠããããšãããªãã
æå Newtonsoft.Json System.Text.Json ããããã£åã®å€§æåå°æå åºå¥ããªãïŒæ¢å®ïŒ åºå¥ããïŒæ¢å®ïŒâ» æ°å€ãæååã§åãåã 倿ãã äŸå€ïŒãªãã·ã§ã³ã§èš±å¯å¯ïŒ æ«å°Ÿã®ã«ã³ããã³ã¡ã³ã 蚱容 äŸå€ïŒãªãã·ã§ã³ã§èš±å¯å¯ïŒ TypeNameHandlingãã ç¡ãïŒå®å šåŽïŒ 埪ç°åç § èšå®ã§å¯Ÿå¿ ReferenceHandlerã§å¯Ÿå¿ïŒ.NET 5 以éïŒâ» ASP.NET Core ã® MVC ã§ã¯æ¢å®ã§å€§æåå°æåãåºå¥ããªãèšå®ã«ãªãã
屿§ã®å¯Ÿå¿ã¯æ¬¡ã®ãšããã
Newtonsoft.Json System.Text.Json [JsonProperty("name")][JsonPropertyName("name")][JsonIgnore][JsonIgnore]ïŒåå空éãéãïŒ[JsonObject]çžåœãªã
[JsonIgnore]ã¯ååãåãã§åå空éãéãããã
usingã®ä»ãæ¿ããå¿ãããšå±æ§ãå¹ããªããªã
ïŒã³ã³ãã€ã«ã¯éãïŒãç§»è¡æã®å žåçãªäºæ ã§ããã
- Try the new System.Text.Json APIs | .NET Blog
https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/ - System.Text.Json and new built-in JSON support in .NET Core - Scott Hanselman
https://www.hanselman.com/blog/SystemTextJsonAndNewBuiltinJSONSupportInNETCore.aspx
JavaScript ã§ã¯ãJSON.parseïŒã·ãªã¢ã©ã€ãºïŒãJSON.stringifyïŒãã·ãªã¢ã©ã€ãºïŒã䜿çšã§ããã
JSON æååãè§£æã㊠JavaScript ã®ãªããžã§ã¯ãã«å€æããïŒã·ãªã¢ã©ã€ãºïŒã
JavaScript ã®å€ã JSON æååã«å€æããïŒãã·ãªã¢ã©ã€ãºïŒã
ç§»è¡ã¡ã¢ïŒæ£èª€ïŒ: åå žã¯
**JSON.parseããã·ãªã¢ã©ã€ãºããJSON.stringifyãããã·ãªã¢ã©ã€ãºã**ãš
èšèŒããŠããããéã§ããã
ã¡ãœãã åäœ æ£ããåŒç§° JSON.parseæåå â ãªããžã§ã¯ã ãã·ãªã¢ã©ã€ãºïŒåŸ©å ïŒ JSON.stringifyãªããžã§ã¯ã â æåå ã·ãªã¢ã©ã€ãºïŒçŽååïŒ åç¯ã®èª¬ææïŒãJSON æååãè§£æããŠã倿ãããçïŒã¯æ£ããããã
æ¬åŒ§å ã®çšèªã®ã¿ãåãéããããŠããã
åå žã©ããã«ç§»è¡ããããã§ãããã«èšæ£ãèšããã
- ãJavaScriptãJSON ã® parse ãš stringify ã¡ãœããã®äœ¿ãæ¹ - TASK NOTES
http://www.task-notes.com/entry/20160719/1468858991 - JSON.stringify ãæ¹ããŠèª¿ã¹ãã - Qiita
http://qiita.com/qoAop/items/57d35a41ef9629351c3c
é çªä¿èšŒããããªãã®ã§ã
-
Dictionary<string, string>ã§ã¯ãªãã{ "key1" : "value1", "key2" : "value2" } -
List<List<String>>ã䜿çšããã[ [ "key1", "value1" ], [ "key2", "value2" ] ]
è£è¶³ïŒãã®åé¿çã®çç±ïŒ: çãããå®åäžããããŠæçšãªææã§ããã
ãåé¡ã JSON ã®ãªããžã§ã¯ãã¯ã仿§äžãããŒã®é åºã«æå³ãç¡ãã â ã»ã·ãªã¢ã©ã€ã¶ãäžŠã¹æ¿ãããããããªã ã»JavaScript ã®ãªããžã§ã¯ããé åºãä¿èšŒããªãïŒæ°å€ããŒã¯ç¹ã«ïŒ â ã³ã³ãããã¯ã¹ã®éžæè¢ããåæã«äžŠã³æ¿ããã ã解決ã é åã¯ãé åºã«æå³ãããã â [ ["key1","value1"], ["key2","value2"] ] ãšããã°é åºãä¿ãããçŸåšã®æžãæ¹ã§ããã°ããªããžã§ã¯ãã®é åã«ããæ¹ãèªã¿ãããã
[ { "value": "1", "text": "éžæè¢A" }, { "value": "2", "text": "éžæè¢B" } ]ãé åºã«æå³ããããã®ã¯é åã§è¡šãããšããååã¯ã
ã³ã³ãããã¯ã¹ã«éããJSON èšèšã®åºæ¬ã§ãã
ïŒã¡ãã¥ãŒãæé ãã©ã³ãã³ã°ãªã©ãåæ§ïŒã
JSON.NETã® JObject ã§ã¯ã
- LINQ to JSON ã䜿çšããŠãä»»æã®ããŒãã«ã¢ã¯ã»ã¹ã§ããã
- LINQ to JSON ãšèšã£ãŠããåçŽã«ã€ã³ãã¯ãµçã«åŠçã§ããæš¡æ§ã
以äžã®ããã«ãã·ãªã¢ã©ã€ãºã§ããã
JObject jObject = (JObject)JsonConvert.DeserializeObject(jsonResult);
if (jObject["Message"] != null)
{
// æ£åžžçµäº
List<Dictionary<string, string>> list =
JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jObject["Result"].ToString());
this.lstRecords.ItemsSource = list;
message = "æ£åžžçµäºããŸãã";
}
else
{
ã»ã»ã»Message ã®æ»ãã«ãã£ãŠãResult ã®æ¹ãå€ããäºäŸã
äžèšã®ã·ããªãªã«åãããŠã以äžã®ããã«ã·ãªã¢ã©ã€ãºã§ããã
object ret = null;
if(ã»ã»ã»)
{
ret = new { ErrorMSG = message };
}
else
{
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
ã»ã»ã»
ret = new { Message = "", Result = list };
}
return Request.CreateResponse(HttpStatusCode.OK, ret);åã« object åã䜿çšããããå¿ååã䜿çšãããããŠã
ã·ãªã¢ã©ã€ãºãã object éå±€æ§é ãå¯å€ã«ããã°ã€ã€ã
è£è¶³ïŒãããæ¬ããŒãžã®çµè«éšåïŒ: åé ã®
**ãéæ§é åããŒã¿ãç²å现工ã®ããã«ãŽãªãŽãªãšåŠçãããã**ãšãã
èŠä»¶ã«å¯Ÿããçããããã§ããããåãæ±ºãŸã£ãŠããéšåã â POCO ã«ãã·ãªã¢ã©ã€ãºïŒåå®å šïŒ ãåãæ±ºãŸã£ãŠããªãéšåã â JObject ã§åããŠãã€ã³ãã¯ãµã§èŸ¿ã â äžèº«ã倿ããæç¹ã§ JsonConvert.DeserializeObject<T>(jObject["Result"].ToString()) â ãã®éšåã ãåä»ãã§æ±ãã€ãŸãããå šéšãåã§åãããããå šéšãåçã«æ±ãããã®
äºæã§ã¯ãªããéšåããšã«äœ¿ãåãããããšããã®ãèŠç¹ã§ããããªããã³ãŒãäŸã§ã¯
jObject["Result"].ToString()ã§æååã«æ»ããŠãã
å床ãã·ãªã¢ã©ã€ãºããŠãããã
çŸåšã¯ToObject<T>()ãäœ¿ãæ¹ãç°¡æœãã€å¹ççã§ãããvar list = jObject["Result"].ToObject<List<Dictionary<string, string>>>();
System.Text.Jsonã§ã¯JsonNode/JsonDocumentã
JObject ã«çžåœããã
JSON.NET System.Text.Json JObjectïŒå¯å€ïŒJsonNode/JsonObjectïŒå¯å€ã.NET 6 以éïŒJToken.ToObject<T>()JsonNode.Deserialize<T>()ïŒ JsonDocumentïŒèªã¿åãå°çšã»é«éïŒèªãã ããªã
JsonDocumentïŒç¢ºä¿ãå°ãªãïŒã
çµã¿ç«ãŠã»æžãæããèŠããªãJsonNodeãšãã䜿ãåãã«ãªãããªãããã®èšèšïŒå¿çã®åœ¢ãç¶æ³ã§å€ããïŒã¯
䜿ãåæã¯ããããAPI ã®å¥çŽãšããŠã¯ææ§ã«ãªãã
JSONãéä¿¡ããRESTãµãŒãã¹ãäœæããæ¹æ³ã®
ã¹ããŒã ãã¡ãŒã¹ãã®èгç¹ã§ã¯ã
- æ£åžžæãšç°åžžæã§åœ¢ãå€ããªãïŒåžžã«åãæ ãè¿ãïŒã
- ç°åžžã¯ HTTP ã®ã¹ããŒã¿ã¹ ã³ãŒãã§è¡šã
æ¹ããã¯ã©ã€ã¢ã³ãã®å®è£ ãåçŽã«ãªãã
- memo: C# ã§ JSON é
åã®ããŒã¹ã«èŠåŽãã話
https://kazyx.blogspot.com/2013/09/cjson.html - JSON.NET ã§å€ãª JSON ãèªã¿èŸŒãæ¹æ³ - ãããã® Blog@hatena
http://blog.okazuki.jp/entry/2014/04/19/235806 - C# + LINQ ã§ JSON ã®ããŒã¹ããã - Qiita
http://qiita.com/numa08/items/475ab3e8aa9e10441a26 - Json.NET (Newtonsoft.Json) ã®åºæ¬çãªäœ¿ãæ¹ | IT ã¡ã¢
https://netweblog.wordpress.com/2016/10/24/json-net-newtonsoft-json-usage/ - LINQ to JSON
http://www.newtonsoft.com/json/help/html/LINQtoJSON.htm- Querying JSON with LINQ
http://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm
- Querying JSON with LINQ
- Introduction
http://www.newtonsoft.com/json/help/html/Introduction.htm - [C#] C# ã§ JSON ãæ±ãæ¹æ³ãŸãšã ïœ Developers.IO
http://dev.classmethod.jp/etc/c-sharp-json/
Tags: ç§»è¡, .NETéçº, .NET Core, ASP.NET, ASP.NET Web API