English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
@JSONField
Mirando el código fuente, puede actuar en campos y métodos.
En referencia a lo que dicen en línea
Primero, el campo de aplicación
@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。
但是我在使用中,发现并不如上所说。
例如
@JSONField(name="project_id") private Long ProjectID
发现bean 转json的时候并是"project_id":xxx的形式,json转bean的时候也不会把"project_id":xx的内容设置到ProjectID的里面。
fastjson的版本是1.1.15
二、作用在setter和getter方法上 这种方式倒是在使用的过程当中符合期望。
/**bean 转json 时会把bean中的ProjectID转换为project_id */ @JSONField(name="project_id") public Long getProjectID() { return ProjectID; } /**json 转bean 时会把json中的project_id值赋值给projectID*/ @JSONField(name="project_id") public void setProjectID(Long projectID) { ProjectID = projectID; }
三、@JSONField其它用法,查看@JSONField注解的源码,除了name可用之外,还有format,serialize,deserialize,serialzeFeatures,parseFeatures可用,
•format,貌似用在Date类型的字段来格式化时间格式比较有用。
•serialize和deserialize是布尔类型的,用法为
@JSONField(serialize=false) private Long ProjectID
就是在序列化的时候就不包含这个字段了。deserialize与之相反。但是有一点需要注意,我看其它地方说,当字段为final的时候注解放在字段上是不起作用的,这时候应该放在get
或set方法上。
•serialzeFeatures,我用到这个属性,fastjson默认的序列化规则是当你的字段的值为null的时候,它是不会给你序列化这个字段的,例如我有一个这样的需求,
{"fieldName":"project_id","operator":"is not","value":null}
一个对象序列化成这样,我的代码如下
CriteriaVO criteriaVO = new CriteriaVO(); criteriaVO.setFieldName("project_id"); criteriaVO.setOperator("is not"); criteriaVO.setValue(null);
Por defecto, solo se serializará como resultado
{"fieldName":"project_id","operator":"is not"}
Por supuesto, fastjson también te permite controlar las reglas de serialización.
Esto utiliza SerializerFeature, que es una enumeración, que tiene varios valores, los cuales pueden interesarte para investigar.
Sólo utilicé uno de ellos,
@JSONField(serialzeFeatures=SerializerFeature.WriteMapNullValue) private String value;
De esta manera, cuando el valor de value es null, aún se serializará su valor. Es decir, se verá así, que es el resultado que quiero.
{"fieldName":"project_id","operator":"is not","value":null}
Encuentro otro problema, cuando el tipo de campo es int, como
private int start; private int limit;
Si no establezco un valor, se serializará de la siguiente manera
"limit":0,"start":0
Por defecto, todos son 0, mientras que mi objetivo es que no aparezcan si no se establece un valor.
Sólo cambié su tipo a Integer. Debería haber otras formas de resolverlo a través de comportamientos de serialización personalizados, que no investigaré por ahora.
Este es todo el contenido que el editor comparte con ustedes sobre algunas preguntas de la anotación @JSONField de fastjson (detallado), espero que les sea útil y que todos apoyen a la tutorial de grito.