2
$\begingroup$

Here's my problem: I've got a JSON-formatted response and want to match some variables over the response. I'm doing it using Cases:

JsonResponse := Import["https://reverse.geocoder.api.here.com/6.2/reversegeocode.json?&app_code=djPZyynKsbTjIUDOBcHZ2g&app_id=xWVIueSv6JL0aJ5xqTxb&gen=3&int=true&jsonAttributes=1&languages=it-it&maxresults=9&mode=retrieveAddresses&prox=43.605979206920594,13.513478915691394,100", "JSON"]

Points = Cases[JsonResponse, {___ "displayPosition" -> "{latitude" -> lat_,"longitude" -> long_ "}", "navigationPosition" -> "{{latitude" -> _Float, "longitude" -> _Float "}}", "mapView" -> "{bottomRight" -> "{latitude" -> _Float, "longitude" -> _Float "}", "topLeft" -> "{latitude" -> _Float, "longitude" -> _Float "}}", "locationId" -> _String, "locationType" -> "point", "address" -> "{city" -> _String, "label" -> _String, "country" -> _String, "county" -> county_, "state" -> state_, "street" -> st_, "houseNumber" -> num_, postalCode -> zip_ ___} -> {{lat, long} -> {st, num, zip, county, state}}, Infinity]

I need to make it consider the inner braces as part of the pattern to be matched (Mathematica parses them as meaning list, otherwise).

$\endgroup$
  • $\begingroup$ It looks like maybe what you want is Cases[JsonResponse, "distance" -> dist_ :> dist, Infinity] $\endgroup$ – mfvonh Sep 22 '15 at 23:29
  • $\begingroup$ @mfvonh the code strangely returns a void list, i'm gonna show the rest of the code $\endgroup$ – Zanfronio Sep 22 '15 at 23:32
  • $\begingroup$ I don't see your point trying to do that. The natural way is matching the lists $\endgroup$ – Dr. belisarius Sep 23 '15 at 3:07
  • $\begingroup$ @belisarius could you give me an example? $\endgroup$ – Zanfronio Sep 23 '15 at 10:12
3
$\begingroup$

I might use Fold to go down the nested rules. At some levels of the data, a list of rules creates an extra set of braces. The Flatten /@ First@... seemed a convenient fix.

locations = Flatten /@ First@
    Fold[
     #2 /. #1 &,
     JsonResponse,
     {"response", "view", "result", 
      "location", {"displayPosition", "address"}}];

{{"latitude", "longitude"} -> {"label", "houseNumber", "postalCode", 
    "county", "state"}} /. locations
(*
{{{43.6062, 13.5135} -> {"Via Luigi Paolucci, 8, 60125 Ancona AN, Italia", "8", "60125", "AN", "Marche"}},
 {{43.6062, 13.5131} -> {"Via Valle Miano, 32, 60125 Ancona AN, Italia", "32", "60125", "AN", "Marche"}},
 {{43.6061, 13.5141} -> {"Svincolo Miano, 60125 Ancona AN, Italia", "houseNumber", "60125", "AN", "Marche"}},
 {{43.6065, 13.5132} -> {"Largo Giovanni Bovio, 2, 60125 Ancona AN, Italia", "2", "60125", "AN", "Marche"}},
 {{43.6062, 13.5128} -> {"Piazzale Bovio Giovanni, 3, 60125 Ancona AN, Italia", "3", "60125", "AN", "Marche"}},
 {{43.606, 13.5144} -> {"Asse Nord Sud, 60125 Ancona AN, Italia", "houseNumber", "60125", "AN", "Marche"}},
 {{43.6059, 13.5144} -> {"Asse Nord Sud, 60125 Ancona AN, Italia", "houseNumber", "60125", "AN", "Marche"}},
 {{43.606, 13.5144} -> {"Asse Nord Sud, 60125 Ancona AN, Italia", "houseNumber", "60125", "AN", "Marche"}},
 {{43.6062, 13.5144} -> {"Asse Nord Sud, 60125 Ancona AN, Italia", "houseNumber", "60125", "AN", "Marche"}}}
*)

Edit: Addendum

Note: In some cases "houseNumber" is missing. As an alternative to DeleteCases mentioned by LLlAMnYP, one could relace unreplaced keys by Sequence.

address = {"label", "houseNumber", "postalCode", "county", "state"};
{{"latitude", "longitude"} -> address} /. locations /. 
 Alternatives @@ address :> Sequence[]
$\endgroup$
  • $\begingroup$ Great, thanks! What if I had to remove the entries without the house number? $\endgroup$ – Zanfronio Sep 23 '15 at 10:59
  • 2
    $\begingroup$ Something like DeleteCases[{_ -> {_, "houseNumber", __}}] $\endgroup$ – LLlAMnYP Sep 23 '15 at 11:42
  • 1
    $\begingroup$ Forgot to ping @Piruzzolo :) $\endgroup$ – LLlAMnYP Sep 23 '15 at 11:43
  • $\begingroup$ @LLlAMnYP Thank you! $\endgroup$ – Zanfronio Sep 23 '15 at 11:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.