Fork me on GitHub

Working with JSON

Ninja提供了开箱即用的支持,可将任意Java对象呈现为JSON以及将JSON解析为Java对象.

Rendering JSON

考虑这个简单的模型类:

package models;

public class Person {       
    String name;
}    

而这个控制器:

package controllers;

public class ApplicationController {       

    public Result index() {

        Person person = new Person();
        person.name = "John Johnson";

        return Results.json().render(person);

    }
}

该控制器将产生格式良好的JSON输出:

{"name":"John Johnson"}

Parsing JSON

如果要解析传入的JSON请求,只需要将映射POJO添加到控制器方法签名中.

考虑以下JSON:

{"name":"John Johnson"}

该JSON映射到以下Java POJO:

package models;

public class Person {       
    String name;
}    

如果您通过HTTP正文将该JSON发送到应用程序,则只需将POJO类添加到控制器方法中,Ninja就会为您解析传入的JSON:

package controllers;

public class ApplicationController {       

    public Result parsePerson(Person person) {
        
        String nameOfPerson = person.name; // will be John Johnson
        ...

    }
}

Rendering JSONP

呈现JSONP(由Javascript函数调用包装的JSON)与呈现普通JSON非常相似:

Results.jsonp().render(person);

要呈现的函数名称必须通过参数callback定义的唯一重要区别. 例如, ?callback = MyApp.Path.myCallback123将产生以下输出:

MyApp.Path.myCallback123({"response":"data"})

您可以在application.conf通过改变回调参数(默认情况下的回调 )的名称

ninja.jsonp.callbackParameter=... // specify your custom callback parameter name
出于安全原因,将清理callback参数的值. 仅纯回调参数值是可能的. 像?callback = MyApp.Path.myCallback123之类的东西有效,但?callback = alert(document.cookie)不起作用.

Advanced JSON usage

忍者在后台使用Jackson( http://wiki.fasterxml.com/JacksonHome ). Jackson是Java生态系统中使用最广泛的JSON序列化程序之一.

如果要自定义Jackson的工作方式,可以通过将ObjectMapper注入启动动作并对其进行修改来实现.

@Singleton
public class MyObjectMapper {

    @Inject 
    ObjectMapper objectMapper;

    @Start(order = 90)
    public void configureObjectMapper() {
        // Adding Joda Time parsing and rendering support to Jackson
        objectMapper.registerModule(new JodaModule());     
    }
}

ObjectMapper是单例,可以由您的应用程序修改和扩展.

在实际使用ObjectMapper之前修改它是安全的,但是在用于解析或生成JSON之后修改ObjectMapper并不是线程安全的.

为了用您自己替换提供的Jackson ObjectMapper,请在您自己的guice模块中执行以下操作:

OptionalBinder.newOptionalBinder(binder(), ObjectMapper.class)
    .setBinding().toProvider(YourObjectMapperProvider.class).in(Singleton.class);

有关Jackson模块的更多信息: http : //wiki.fasterxml.com/JacksonFeatureModules

Jackson JSON Views

Ninja还支持Jackson的JSON视图:使用@JsonView批注,您可以轻松定义要包含在JSON输出中的对象的哪些属性. 一个简单的示例,其中仅包含"名称"字段:

public class AppController {

    public Result jsonPerson() {
        Person person = new Person();
        person.name = "John Doe";
        person.age = 56;
        
        return Results.json().jsonView(View.Public.class).render(person);
    }
    
    static class Person {
        @JsonView(View.Public.class)
        public String name;
        
        @JsonView(View.Private.class)
        public Integer age;
    }
    
    static class View {
        static class Public {}
        static class Private {}
    }
}

有关Jackson的JSON视图的更多信息: http : //wiki.fasterxml.com/JacksonJsonViews


by  ICOPY.SITE