2011-04-25 5 views
3

J'ai un hachage à revenir d'une source de données XML qui ressemble à ceci:Choisir un tableau de hachages d'un hachage

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

Je voudrais obtenir tous les record hash dans un tableau afin que je puisse filter() et faire d'autres opérations. Cependant, quand j'ai cette déclaration dans mon bloc pre,

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

le tableau qui est renvoyée est un tableau de deux chaînes vides:

var raw_records = ['', '']; 

La chose étrange est que je peux choisir juste availability avec des résultats attendus:

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

production

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

Quel est le problème avec mon premier pick()?

EDIT: Voici une version plus complète qui devrait aider à reproduire le problème. Il est un peu différent, puisque je suis en utilisant la version JSON du service web maintenant:

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; 
} 
+0

ne peut pas se reproduire. Besoin de plus d'informations :) – Alex

+0

Maintenant, nous travaillons à reproduire et à creuser. Merci pour l'exemple développé. – Alex

+0

Pour l'exemple ci-dessus, j'ai testé sur http://www.amazon.com/Sams-Teach-Yourself-Java-Hours/dp/0672330768/ quand j'ai eu ce problème. –

Répondre

1

Je vais avoir besoin d'un exemple plus complet. L'application de test et les résultats je suis arrivé sont ci-dessous:

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."); 
    } 
} 

Et Résultats:

var raw_records = [{'availability' :{'$t' :'available'}}, {'availability' :{'$t' :'available'}}]; 
var availability = ['available', 'available']; 
Questions connexes