2011-05-26 16 views
6

estoy tratando de consumir una matriz JSON creé usando JavaScript, pero la matriz no está ligada en mi regulador¡Consumiendo JSON en juego! Controlador marco

Aquí está el código JavaScript que utilizo para llamar a mi acción del controlador

$.post("/produits_ajax",{filterParams:[{name:"milk", value:"chevre"}, {name:"pate", value:"molle"}]}, 
function(data){ 
    $('.dynamicContent').html(data); 
slideProducts(); 
// initialize scrollable 
$(".scrollable").scrollable(); 

}); 

Mi archivo de rutas entrada

POST  /produits_ajax  Application.produitsAjax 

¡Así es como lo recibo en mi juego! controlador. Estoy usando jugar a 1,1 y la JSONArray es de com.google.gson.JsonArray

public static void produitsAjax(JsonArray filterParams) { 
    if(filterParams != null) 
     Logger.debug("Le Json: " + filterParams.toString()); 
    else 
     Logger.debug("filterParams is null"); 

    render(); 
} 

Como se puede imaginar que siempre sale "filterParams es nulo" en mi consola (no estaría retorciéndose esto si no era)

Es muy básico hasta ahora solo quiero vincular la matriz generada en JS a mi JsonArray. Play! Framework tiene una gran documentación, pero por alguna razón hay muy poco sobre este tema en particular.

Si alguien puede arrojar algo de luz sobre esto, sería muy apreciada

Respuesta

17

Sólo tienes que crear una clase TypeBinder para agregar capacidad de unión JSONObject ¡jugar!. En realidad, eso es bastante fácil de lograr en Play 1.2. Aquí está la clase completa:

@Global 
public class JsonObjectBinder implements TypeBinder<JsonObject> { 

    @Override 
    public Object bind(String name, Annotation[] annotations, String value, Class actualClass, Type genericType) throws Exception { 
     return new JsonParser().parse(value); 
    } 

} 

Eso es todo! Con la anotación @Global, Play lo encontrará en el momento de la carga y lo registrará con las otras carpetas. Lo uso en mi controlador con la siguiente firma:

public static void handleJsonBody(JsonObject body) { 
    ... 
} 

El cuerpo será analizado automáticamente por Play. Puede hacer lo mismo con JsonArray para respaldar su caso particular.

4

tiene 2 opciones:

  • simple: pasar el parámetro como una cadena y en el controlador de analizarlo a JSON
  • compleja: crear su propia carpeta usando TypeBinder
+0

KISS generalmente el trabajo es genial para mí. Así que terminé pasando una cadena simple como esta: filterParams: "milk = chevre & pate = molle" y analizándola en el controlador usando el método String.split(). – Alain

+0

Gracias por su ayuda Pere – Alain

Cuestiones relacionadas