2017-08-04 5 views
0

私は初心者初心者です。 私は次の質問をしていますが、typeプロパティに基づいてJSONのドキュメント構造が異なる場合があります。下の私の例を見てください。 { "recipientId": "xxx", "messages": [ { "type": "text", "text": "hi there!" }, { "type": "image", "url": "http://example.com/image.jpg", "preview": "http://example.com/thumbnail.jpg" } ] } 私は次のような出力受け取りたい変換後:ここで { "messages" : [ { "text" : "hi there!", "type" : "text" }, { "type" : "image", "url" : "http://example.com/image.jpg", "preview": "http://example.com/thumbnail.jpg" } ], "to" : "xxx" } プロパティ値の1つに基づくJOLTサブツリーの検証

は私が思い付いたスペックです: [ { "operation": "shift", "spec": { "recipientId": "to", "messages": { "*": { "type": "messages[&1].type", "text": "messages[&1].text", "url": "messages[&1].url", "preview": "messages[&1].previewImageUrl" } } } } ]

このアプローチの問題は、私は"type": "text"を持っていると私場合ならばということですまた"preview"プロパティに値をスローすると、タイプtextには"preview"プロパティが設定されていてはなりません。 したがって、私は、 "type"プロパティの値に基づいていくつかのプロパティを無視するか、そのようなペイロードを変換しないようにしたいと思います。

JOLTでこのような「バリデーション」を行う方法はありますか?私が見る他のオプションは、ジャクソンタイプ階層でそれを検証することです。

答えて

0

「タイプ」の値にマッチして、ツリーの一部をバックアップして、「テキスト」タイプまたは「イメージ」タイプとしてメッセージを処理します。

入力

​​3210

スペック

[ 
    { 
    "operation": "shift", 
    "spec": { 
     "recipientId": "to", 
     "messages": { 
     "*": { // the array index of the messages array, referenced below 
       // as [&2] or [&4] depending how far down they have gone 
      "type": { 
      // always pass the value of type thru 
      "@": "messages[&2].type", 

      "text": { 
       // if the value of type was "text", then 
       // go back up the tree 3 levels (0,1,2) 
       // and process the whole message as a "text" type 
       "@2": { 
       "text": "messages[&4].text" 
       } 
      }, 
      "image": { 
       "@2": { 
       // if the value of type was "image", then 
       // go back up the tree 3 levels (0,1,2) 
       // and process the whole message as a "image" type 
       "url": "messages[&4].url", 
       "preview": "messages[&4].previewImageUrl" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
] 
+0

おかげでお返事のための多くは、はるかに高く評価します! 私はあなたの仕様を試しました。 特定のメッセージタイプに属していないプロパティをスキップできます。 しかし、特定のメッセージタイプに不可欠なすべてのプロパティが存在するかどうかは検証されません。たとえば、 "type"が "text"に設定されている場合、 "text"プロパティがメッセージに存在しない場合、joltが変換に失敗することが予想されます。実際には、ジョルトは重要なキーがなくても変換を実行します。 –

+0

強制キーがツリーにない場合、強制的に変換を失敗させる方法はありますか? –

+0

いいえ、joltは特に失敗しないように設計されています。このようなもの(このキーまたはそのキーは必須です)では、Jsonスキーマのような別のツールを使用する必要があります。 –

関連する問題