简答:Jackson 代表 JSON 和 JAXB 代表 XML
Play 本身不提供任何关于编组模型的文档,但它提供了可以完成这项工作的第三方库。
JSON:
型号:
public class User extends Model {
public String username;
public Long age;
@JsonIgnore
public String password; // field won't be marshalled
}
使用 jackson 的 ObjectMapper.writeValueAsString() 方法将其编组为 JSON。
import org.codehaus.jackson.map.ObjectMapper;
//
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(country);
JSON 输出:
{
"username" : "John Smith",
"age" : "25"
}
XML:
必须小心使用 generates getters and setters 的引擎盖下的模型。您不会在代码中看到 getter 和 setter,但它们在运行时存在。
在模型上,将XmlAccessorType 注释设置为PROPERTY 很重要。这告诉 JAXB 从 getter/setter 而不是从基础字段 进行序列化。
@XmlAccessorType(XmlAccessType.PROPERTY)
我们还必须添加一个 @XmlRootElement 注释,它指定根 XML 节点的名称:
@XmlRootElement(name = "UserRoot")
要省略字段,我们必须在 getter 中添加 @XmlTransient 注释。由于源代码中没有 getter,因此我们必须为要省略的每个字段添加一个。
@XmlAccessorType(XmlAccessType.PROPERTY)
public class User extends Model {
public String username;
public Long age;
@JsonIgnore
public String password;
@XmlTransient // This means ignore this property
public String getPassword() {
return this.password;
}
}
编组由 JAXB 类 Marshaller 和 JAXBContext 执行
JAXBContext context = JAXBContext.newInstance(User.class);
Marshaller marshaller = context.createMarshaller();
// Use linefeeds and indentation in the outputted XML
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(user, System.out);
输出:
<UserRoot>
<name>John Smith</name>
<age>25</age>
</UserRoot>
总结:
Play docs on XML 和 Play docs on JSON 确实提供了一些有关使用 json/xml 的信息,但似乎没有任何 Play Docs 描述如何进行 编组。为此,我们必须查看第三方库和文档。