web-dev-qa-db-ja.com

ネストされたJSONオブジェクトのJsonpath

ネストされたフィールドを持つJSONがあります:

  [
    {
    "Platform Parent Dato Id": "23768",
    "Platform Dato Id": "24138",
    "Platform Dato Name": "Random Europe",
    "Platform mission Id": "111112",
    "Platform submission Id": "638687",
    "Platform submission Flight Id": "863524",
    "Start Date": "2017-12-01",
    "End Date": "2017-12-02",
    "Platform Compensation": 109.0909,
    "Total Value": 909.0909,
    "Goal": "200000.0000",
    "Value Information": {
      "Platform Compensation": [
        {
          "Platform mission Id": "111112",
          "Platform submission Id": "638687",
          "Platform submission Flight Id": "863524",
          "Value Rate": "14.0000",
          "Value": 109.0909
        }
      ]
    }
  },
  {
    "Platform Parent Dato Id": "23768",
    "Platform Dato Id": "24138",
    "Platform Dato Name": "Random Europe",
    "Platform mission Id": "111113",
    "Platform submission Id": "638687",
    "Platform submission Flight Id": "863524",
    "Start Date": "2017-12-01",
    "End Date": "2017-12-02",
    "Platform Compensation": 109.0909,
    "Total Value": 909.0909,
    "Goal": "200000.0000",
    "Value Information": {
      "Platform Compensation": [
        {
          "Platform mission Id": "111113",
          "Platform submission Id": "638687",
          "Platform submission Flight Id": "863524",
          "Value Rate": "12.0000",
          "Value": 109.0909
        }
      ]
    }
  }
  ]

Value RateネストからValue Informationを取得するためにJSONPATHを使用しています。

このWebサイトにJSONテキストを貼り付けました: http://jsonpath.com/ そしてこの行を使用した後:

$[*].['Platform Compensation'].['Value Rate']

私はこれを取得しています:

enter image description here

そしてこの行を使用した後:

$.['Value Information'].['Platform Compensation'].['Platform mission Id']

私はこれを取得しています:

enter image description here

私が返そうとしているもの(出力)は次のとおりです。

enter image description here

しかし、これら2つを1行に組み合わせて、1つのJSONPATHクエリで両方を返すための正しい構文が見つかりません。

6
Apolo Radomer

jsonpathを使用して、特定の式のvaluesを選択でき、一部の実装では、カスタマイズされた述語の値を選択できますが、射影はサポートされていません。

jsonpathを使用して、指定されたJSONをフィルタリングできます。例えば:

  • すべてのPlatform Compensation値を含む配列を返します。

    $.['Value Information'].['Platform Compensation'].['Platform mission Id']
    
  • すべてのPlatform mission Id値を含む配列を返します。

    $.['Value Information'].['Platform Compensation']
    

ただし、jsonpathを使用してキーと値のサブセットを読み取ることはできません。キーと値のサブセットを読み取るには、JSON逆シリアル化ライブラリを使用する必要があります。 Javaの世界で)一般的に使用されるライブラリは、 JacksonGson などです。

ジャクソンを使用した例を次に示します。

String json = "...";

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> asMap = mapper.readValue(json, Map.class);

Map<String, Object> transformed = new HashMap<>();
transformed.put("Platform mission Id", asMap.get("Platform mission Id"));
transformed.put("Value Rate", asMap.get("Value Rate"));

String result = mapper.writeValueAsString(transformed);
2
glytching

Jayway 実装によりそれが可能になります。 jsonpathは$.[*]['Value Information']['Platform Compensation'][*]['Platform mission Id', 'Value Rate']

このウェブサイトで試すことができます http://jsonpath.herokuapp.com/

2
Pompelmo