24182


json 間の構造的な diff が取りたいです。これを実現する方法はありますか。

イメージとしては、 `jsondiff a.json b.json` とやると、 json の構造的な差分が出力されるようなツールです。(`a.json`,
`b.json` はそれぞれ、単一の json オブジェクトからなるテキストファイル)

背景としては、２つの、 type 定義にそこそこの差異が発生している ES サーバー２つがあったときに
(しかし、おそらく半分ぐらいの構造は一致している、、はず) 、その mapping の定義 (SQL でいう create 文の集合のようなもの)
の差分を取得したい、がやりたいことです。  
REST api をたたいて、それぞれから mapping 定義を json
を取得した状態で、ここから差分を計算しようとしているのですが、いいツールがあるといいなと思いながら質問しています。

* * *

参考のために、 Elasticsearch から取得できる mapping 情報 json がどのようなものかというと、
[公式サイト](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html)
より例えば次のような形です。

[code]

    {
      "mappings": {
        "user": {
          "_all":       { "enabled": false  },
          "properties": {
            "title":    { "type": "string"  },
            "name":     { "type": "string"  },
            "age":      { "type": "integer" }
          }
        },
        "blogpost": {
          "properties": {
            "title":    { "type": "string"  },
            "body":     { "type": "string"  },
            "user_id":  {
              "type":   "string",
              "index":  "not_analyzed"
            },
            "created":  {
              "type":   "date",
              "format": "strict_date_optional_time||epoch_millis"
            }
          }
        }
      }
    }
    
[/code]


CC BY-SA 3.0
2016-04-19T17:13:29.697
24162
2016-04-20T09:46:07.020
2016-04-20T07:11:40.933
754
754
question
json unix
json 間の構造的な diff を取るには？


[jq](https://stedolan.github.io/jq/)コマンドでJSONを整形して、その差分をとるのはどうでしょうか。`--sort-
keys` / `-S` フラグは任意ですが、オブジェクトのキーは揃えたほうが無難でしょう。

JSONを整形出力するコマンドは `python -m json.tool` でも代用できると思います。

[code]

    #!/bin/bash
    set -eu
    
    json_pretty='jq . --sort-keys'
    
    diff -u <($json_pretty $1) <($json_pretty $2)
    
[/code]

実行例

[code]

    $ jsondiff.sh a.json b.json
    --- /dev/fd/63  2016-04-20 02:57:59.000000000 +0900
    +++ /dev/fd/62  2016-04-20 02:57:59.000000000 +0900
    @@ -2,7 +2,7 @@
       "mappings": {
         "user": {
           "_all": {
    -        "enabled": false
    +        "enabled": true
           },
           "properties": {
             "title": {
    
[/code]


CC BY-SA 3.0
2016-04-19T18:20:12.130
24163
2016-04-19T19:05:14.830
2016-04-19T19:05:14.830
2391
2391
24162
answer


使えそうなツールがありました。どうでしょうか。

  * <https://www.npmjs.com/package/json-diff>
  * <https://github.com/stefankoegl/python-json-patch>


CC BY-SA 3.0
2016-04-20T09:46:07.020
24182
2016-04-20T09:46:07.020
9575
24162
answer