2012-10-31 13 views
5

Obecnie robię pewne rzeczy z API REST w clojure i używam biblioteki ring.middleware.format z compojure do transformacji JSON do struktur danych clojure.Clojure ring wrap-json-params psuje tablice JSON

Mam ogromny problem, w tym i JSON wysłany do aplikacji pierścienia będzie miał wszystkie tablice zastąpione pierwszym elementem, który był w tablicy. TO ZNACZY. okaże się to JSON pisał do niego z

{ 
    "buyer":"Test Name", 
    "items":[ 
     {"qty":1,"size":"S","product":"Red T-Shirt"}, 
     {"qty":1,"size":"M","product":"Green T-Shirt"} 
    ], 
    "address":"123 Fake St", 
    "shipping":"express" 
} 

do tego

{ 
    "buyer": "Test Name", 
    "items": { 
     "qty": 1, 
     "size": "M", 
     "product": "Green T-Shirt" 
    }, 
    "address": "123 Fake St", 
    "shipping": "express" 
} 

robi to dla dowolnych macierzy, w tym gdy tablica jest elementem głównym.

Używam następujący kod w Clojure zwrotu json:

(defroutes app-routes 
    (GET "/" 
     [] 
     {:body test-data}) 
    (POST "/" 
     {data :params} 
     {:body data})) 
     ;{:body (str "Printing " (count (data :jobs)) " jobs")})) 

(def app 
    (-> (handler/api app-routes) 
     (wrap-json-params) 
     (wrap-json-response))) 

Trasa GET ma żadnych problemów z tablicami i wyjść prawidłowo, więc to musi być droga jestem coraz danych lub oprogramowanie pośredniczące wrap-restful-params.

Wszelkie pomysły?

Odpowiedz

3

Mam podobny problem z ring-json-params. Więc skończyło się na użyciu surowego ciała żądania i samemu analizowaniu łańcucha JSON.

użyłem kodu folliwng:

(defroutes app-routes 
(POST "/" 
    {params :body} 
    (slurp params))) 

używam biblioteki CLJ-json.core celu analizowania JSON.

Mam nadzieję, że to pomoże. Jeśli wymyśliłeś lepszy sposób, to udostępnij. Jestem nowicjuszem Clojure/Compojure !!!

+0

Dzięki! To działało świetnie. To nie jest idealne rozwiązanie, ale działa. –

+1

Świetnie. Zgadzam się, że to nie jest najlepsze rozwiązanie. Rozwidlałem repozytorium ring-json-params i spróbuję rozwiązać problem. –

+0

Czy kiedykolwiek doszedłeś do sedna tego? Znalazłem podobny problem w formacie ring-middleware i otworzyłem problem: https://github.com/ngrunwald/ring-middleware-format/issues/15 – noahlz

0

Wiem, że minęło trochę czasu, ale po prostu natknąłem się na ten sam problem. Jedynym sposobem, w jaki udało mi się go uruchomić, było użycie ring.middleware.format/wrap-restful-formatprzed the compojure.handler/api. Nie jestem pewien, dlaczego tak jest, ale jeśli mogę umieścić compujure.handler/api opakowanie po pierwsze, zadziera do góry parameteres tablicę

0

wpadłem na ten problem niedawno i rzeczywiście zorientowali się, w czym jest problem: to, że masz wrap-nested-params middleware dostaniem ocenione po twoim middleware, które powoduje spłaszczenie obiektów przechowywanych w tablicach JSON/wektorach Clojure przez chwytanie pierwszego elementu zawartego w środku.

user=> bod-map 
{:address "100 Bush Street", :contacts [{:name "Dudely Mcdooderson", :title "engineer", :tax_id "555"}], :name "Dudely Inc.", :tax_id "5234234"} 
user=> (ring.middleware.nested-params/nested-params-request {:params bod-map}) 
{:params {"tax_id" "5234234", "name" "Dudely Inc.", "contacts" {:name "Dudely Mcdooderson", :title "engineer", :tax_id "555"}, "address" "100 Bush Street"}} 

Można obejść ten problem, po prostu upewniając się, że parametry zagnieżdżone są oceniane najpierw w porządku oprogramowania pośredniego.

Powiązane problemy