3

次のようなXMLデータソースから戻ってきたハッシュがあります。

{...,
  'records' :{
    'record' :[
      {'availability' :{'$t' :'available'}, ...},
      {'availability' :{'$t' :'available'}, ...}
    ]
  }
};

recordすべてのハッシュを配列に入れて、filter()それを実行して他の操作を実行できるようにしたいと思います。ただし、このステートメントをpreブロックに含めると、

raw_records = raw.pick("$..record");

返される配列は、2つの空の文字列の配列です。

var raw_records = ['', ''];

奇妙なことにavailability、期待どおりの結果が得られるということです。

availability = raw.pick("$..availability.$t");

生産

var availability = ['available', 'available'];

私の最初の何が問題になっていpick()ますか?

編集:これは、問題の再現に役立つ、より完全なバージョンです。現在、JSONバージョンのWebサービスを使用しているため、少し異なります。

global {
    datasource hbll <- "https://svc.lib.byu.edu/services/catalog/v1/search/?field=isbn&format=json&terms=";
}

rule new_rule {
    select when pageview "amazon.com/.*/?dp/(.*)/" setting (isbn)
    pre {
        //This is the array with two empty strings...
        raw = datasource:hbll(isbn);
        myfilter = function(x) { x.pick("availability") eq "available"; };
        records = raw.filter(myfilter);
        len = records.length();
        availability = records.pick("$..availability");
        middleman = len > 1 => availability[0] | availability;
        available = middleman eq "available" => true | false;
        url_list = records.pick("$..url");
        url = len > 1 => url_list[0] | url_list;
        msg = <<
            <p>This book is available for checkout at the BYU Library.</p>
            <a href="#{url}">More information</a>
        >>;
    }
    notify("BYU Harold B. Lee Library", msg) with sticky=true;
}
4

1 に答える 1

1

もっと完全な例が必要です。私が得たテストアプリと結果は次のとおりです。

ruleset a8x167 {
    meta {
        name "Pick - Array of Hashes"
        description <<
            Testing
        >>
        author "Sam Curren"
        logging on
    }

    dispatch {}

    global {
        raw = {
          'records' :{
            'record' :[
              {'availability' :{'$t' :'available'}},
              {'availability' :{'$t' :'available'}}
            ]
          }
        };

    }

    rule test {
        select when pageview ".*" setting ()
        pre {
            raw_records = raw.pick("$..record");
            availability = raw.pick("$..availability.$t");
        }
        notify("Hello World", "This is a sample rule.");
    }
}

そして結果:

var raw_records = [{'availability' :{'$t' :'available'}}, {'availability' :{'$t' :'available'}}];
var availability = ['available', 'available'];
于 2011-04-25T21:23:35.640 に答える