English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Alcuni problemi riguardanti l'annotazione @JSONField di fastjson (spiegato in dettaglio)

@JSONField

看源码它可以作用于字段和方法上。

引用网上说的,

一、作用Field

@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);

Di default, serializzerà solo come segue

{"fieldName":"project_id","operator":"is not"}

Naturalmente, fastjson ti permette di controllare anche le regole di serializzazione

Questo utilizza SerializerFeature, un enum con diversi valori, il cui significato può essere scoperto da chiunque sia interessato

Ho utilizzato solo uno di essi

@JSONField(serialzeFeatures=SerializerFeature.WriteMapNullValue)
private String value;

In questo modo, quando il valore di value è null, verrà ancora serializzato. Ecco come appare, è esattamente il risultato che desideravo

{"fieldName":"project_id","operator":"is not","value":null} 

Ho incontrato un altro problema, quando il tipo del campo è int, come

private int start;
private int limit;

Se non imposto il valore, verrà serializzato così

"limit":0,"start":0

Di default sono tutti 0, ma il mio obiettivo è che non appaiano se non vengono impostati i valori.

Ho semplicemente cambiato il loro tipo in Integer. Dovrebbe esserci anche un altro modo per risolvere questo problema tramite comportamenti di serializzazione personalizzati, ma non lo studio ora.

Questa guida dettagliata su alcune domande riguardanti l'annotazione @JSONField di fastjson è tutto ciò che il redattore ha condiviso con voi. Spero che possa essere utile come riferimento e spero che tutti possano sostenere la guida di urla.

Ti potrebbe interessare