.NET CoreでJSON Pathを使用してオブジェクトを追加してみる

csharp C#

この記事の内容

この記事では、.NET CoreのConsole Applicationで、jsonファイルの内容を別のjsonファイルの内容に追加する方法を紹介します。要素の追加にJSON Path(XPathのようなもの)を使って、追加先のオブジェクトを指定したりします。

使用するjsonファイル

以下のfrom.jsonとto.jsonを使用します。

from.json

{
  "pokemon": [
    {
      "no": 1,
      "name": "フシギダネ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [ 2 ],
      "types": [ "くさ", "どく" ],
      "abilities": [ "しんりょく" ],
      "hiddenAbilities": [ "ようりょくそ" ],
      "stats": {
        "hp": 45,
        "attack": 49,
        "defence": 49,
        "spAttack": 65,
        "spDefence": 65,
        "speed": 45
      }
    },
    {
      "no": 2,
      "name": "フシギソウ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [ 3 ],
      "types": [ "くさ", "どく" ],
      "abilities": [ "しんりょく" ],
      "hiddenAbilities": [ "ようりょくそ" ],
      "stats": {
        "hp": 60,
        "attack": 62,
        "defence": 63,
        "spAttack": 80,
        "spDefence": 80,
        "speed": 60
      }
    },
    {
      "no": 3,
      "name": "フシギバナ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [],
      "types": [ "くさ", "どく" ],
      "abilities": [ "しんりょく" ],
      "hiddenAbilities": [ "ようりょくそ" ],
      "stats": {
        "hp": 80,
        "attack": 82,
        "defence": 83,
        "spAttack": 100,
        "spDefence": 100,
        "speed": 80
      }
    }
  ]
}

to.json

{
  "pokemon": [
    {
      "no": 152,
      "name": "チコリータ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [ 153 ],
      "types": [ "くさ" ],
      "abilities": [ "しんりょく" ],
      "hiddenAbilities": [ "リーフガード" ],
      "stats": {
        "hp": 45,
        "attack": 49,
        "defence": 65,
        "spAttack": 49,
        "spDefence": 65,
        "speed": 45
      }
    },
    {
      "no": 153,
      "name": "ベイリーフ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [ 154 ],
      "types": [ "くさ" ],
      "abilities": [ "しんりょく" ],
      "hiddenAbilities": [ "リーフガード" ],
      "stats": {
        "hp": 60,
        "attack": 62,
        "defence": 80,
        "spAttack": 63,
        "spDefence": 80,
        "speed": 60
      }
    },
    {
      "no": 154,
      "name": "メガニウム",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [],
      "types": [ "くさ" ],
      "abilities": [ "しんりょく" ],
      "hiddenAbilities": [ "リーフガード" ],
      "stats": {
        "hp": 80,
        "attack": 82,
        "defence": 100,
        "spAttack": 83,
        "spDefence": 100,
        "speed": 80
      }
    }
  ]
}

事前準備

JSONを扱うためNuGetにて、Newtonsoft.Jsonをインストールしてください。

from.jsonの内容をto.jsonに追加する その1

from.jsonの内容を”old_pokemon”として追記します。

ソースコードは以下の通りです。

using Newtonsoft.Json.Linq;
using System;
using System.IO;

namespace ConsoleApp
{
    class Program    
    {
        static void Main(string[] args)
        {
            string fromJson = File.ReadAllText("from.json");
            JObject fromObject = JObject.Parse(fromJson);

            string toJson = File.ReadAllText("to.json");
            JObject toObject = JObject.Parse(toJson);

            JToken fromPokemons = fromObject.SelectToken("$.pokemon");
            JToken toPokemons = toObject.SelectToken("$.pokemon");

            toPokemons.Parent.AddAfterSelf(new JProperty("old_pokemon", fromPokemons));

            Console.WriteLine(toObject.ToString());
        }
    }
}

出力結果

{
  "pokemon": [
    {
      "no": 152,
      "name": "チコリータ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        153
      ],
      "types": [
        "くさ"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "リーフガード"
      ],
      "stats": {
        "hp": 45,
        "attack": 49,
        "defence": 65,
        "spAttack": 49,
        "spDefence": 65,
        "speed": 45
      }
    },
    {
      "no": 153,
      "name": "ベイリーフ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        154
      ],
      "types": [
        "くさ"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "リーフガード"
      ],
      "stats": {
        "hp": 60,
        "attack": 62,
        "defence": 80,
        "spAttack": 63,
        "spDefence": 80,
        "speed": 60
      }
    },
    {
      "no": 154,
      "name": "メガニウム",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [],
      "types": [
        "くさ"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "リーフガード"
      ],
      "stats": {
        "hp": 80,
        "attack": 82,
        "defence": 100,
        "spAttack": 83,
        "spDefence": 100,
        "speed": 80
      }
    }
  ],
  "old_pokemon": [
    {
      "no": 1,
      "name": "フシギダネ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        2
      ],
      "types": [
        "くさ",
        "どく"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "ようりょくそ"
      ],
      "stats": {
        "hp": 45,
        "attack": 49,
        "defence": 49,
        "spAttack": 65,
        "spDefence": 65,
        "speed": 45
      }
    },
    {
      "no": 2,
      "name": "フシギソウ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        3
      ],
      "types": [
        "くさ",
        "どく"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "ようりょくそ"
      ],
      "stats": {
        "hp": 60,
        "attack": 62,
        "defence": 63,
        "spAttack": 80,
        "spDefence": 80,
        "speed": 60
      }
    },
    {
      "no": 3,
      "name": "フシギバナ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [],
      "types": [
        "くさ",
        "どく"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "ようりょくそ"
      ],
      "stats": {
        "hp": 80,
        "attack": 82,
        "defence": 83,
        "spAttack": 100,
        "spDefence": 100,
        "speed": 80
      }
    }
  ]
}

from.jsonの内容をto.jsonに追加する その2

to.jsonのnoが154のメガニウムの後ろに、from.jsonのフシギバナを追加する例を記載します。

using Newtonsoft.Json.Linq;
using System;
using System.IO;

namespace ConsoleApp
{
    class Program    
    {
        static void Main(string[] args)
        {
            string fromJson = File.ReadAllText("from.json");
            JObject fromObject = JObject.Parse(fromJson);

            string toJson = File.ReadAllText("to.json");
            JObject toObject = JObject.Parse(toJson);

            JToken fromPokemons = fromObject.SelectToken("$.pokemon[?(@.no==1)]");
            JToken toPokemons = toObject.SelectToken("$.pokemon[?(@.no==154)]");

            toPokemons.AddAfterSelf(fromPokemons);

            Console.WriteLine(toObject.ToString());
        }
    }
}

出力結果

{
  "pokemon": [
    {
      "no": 152,
      "name": "チコリータ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        153
      ],
      "types": [
        "くさ"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "リーフガード"
      ],
      "stats": {
        "hp": 45,
        "attack": 49,
        "defence": 65,
        "spAttack": 49,
        "spDefence": 65,
        "speed": 45
      }
    },
    {
      "no": 153,
      "name": "ベイリーフ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        154
      ],
      "types": [
        "くさ"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "リーフガード"
      ],
      "stats": {
        "hp": 60,
        "attack": 62,
        "defence": 80,
        "spAttack": 63,
        "spDefence": 80,
        "speed": 60
      }
    },
    {
      "no": 154,
      "name": "メガニウム",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [],
      "types": [
        "くさ"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "リーフガード"
      ],
      "stats": {
        "hp": 80,
        "attack": 82,
        "defence": 100,
        "spAttack": 83,
        "spDefence": 100,
        "speed": 80
      }
    },
    {
      "no": 1,
      "name": "フシギダネ",
      "form": "",
      "isMegaEvolution": false,
      "evolutions": [
        2
      ],
      "types": [
        "くさ",
        "どく"
      ],
      "abilities": [
        "しんりょく"
      ],
      "hiddenAbilities": [
        "ようりょくそ"
      ],
      "stats": {
        "hp": 45,
        "attack": 49,
        "defence": 49,
        "spAttack": 65,
        "spDefence": 65,
        "speed": 45
      }
    }
  ]
}

コメント