9

JSON入力ステップで次を処理しようとしています:

{"address":[
  {"AddressId":"1_1","Street":"A Street"},
  {"AddressId":"1_101","Street":"Another Street"},
  {"AddressId":"1_102","Street":"One more street", "Locality":"Buenos Aires"},
  {"AddressId":"1_102","Locality":"New York"}
]}

ただし、これは不可能のようです:

Json Input.0 - ERROR (version 4.2.1-stable, build 15952 from 2011-10-25 15.27.10 by buildguy) : 
The data structure is not the same inside the resource! 
We found 1 values for json path [$..Locality], which is different that the number retourned for path [$..Street] (3509 values). 
We MUST have the same number of values for all paths.

このステップではIgnore Missing Pathフラグが提供されますが、すべての行で同じパスが見つからない場合にのみ機能します。その場合、そのステップは期待どおりに機能し、欠損値を null で埋めます。

これは、私の優先事項の 1 つであった不均等なデータを読み取るこのステップの能力を制限します。

私のステップ フィールドは次のように定義されています。

JSON 入力フィールドの定義

何か不足していますか?これは正しい動作ですか?

4

2 に答える 2

11

私が行ったことは、$.address[*] を使用して JSON 入力を使用し、jsonRow フィールドに各要素 pe の完全なマップを読み取ることです。

{"address":[
    {"AddressId":"1_1","Street":"A Street"},  
    {"AddressId":"1_101","Street":"Another Street"},  
    {"AddressId":"1_102","Street":"One more street", "Locality":"Buenos Aires"},   
    {"AddressId":"1_102","Locality":"New York"} 
]}

これにより、要素 pe ごとに 1 つずつ、4 つの jsonRows が生成されjsonRow = {"AddressId":"1_101","Street":"Another Street"}ます。次に、Javascript ステップを使用して、これを使用して値をマップします。

var AddressId = getFromMap('AddressId', jsonRow);
var Street = getFromMap('Street', jsonRow);
var Locality = getFromMap('Locality', jsonRow);

2 番目のスクリプト タブで、https ://github.com/douglascrockford/JSON-js からの縮小された JSON 解析コードと getFromMap 関数を挿入しました。

function getFromMap(key,jsonRow){
  try{
   var map = JSON.parse(jsonRow);
  }
  catch(e){
   var message = "Unparsable JSON: "+jsonRow+" Desc: "+e.message;
   var nr_errors = 1;
   var field = "jsonRow";
   var errcode = "JSON_PARSE";
   _step_.putError(getInputRowMeta(), row, nr_errors, message, field, errcode);
   trans_Status = SKIP_TRANSFORMATION;
   return null;
  }

  if(map[key] == undefined){
   return null;
  }
  trans_Status = CONTINUE_TRANSFORMATION;
  return map[key]
}
于 2012-03-14T16:17:33.087 に答える