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

Des questions sur l'annotation @JSONField de fastjson (détaillé)

@JSONField

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

引用网上说的,

一、作用Field

Lorsque @JSONField est appliqué sur le champ, son name ne définit pas seulement le nom de la clé d'entrée, mais aussi le nom de sortie.

Mais dans mon utilisation, je trouve que cela ne correspond pas à ce qui est dit

Par exemple

@JSONField(name="project_id")
private Long ProjectID

Je découvre que lors de la conversion bean vers json, ce n'est pas sous la forme "project_id":xxx, et lors de la conversion json vers bean, le contenu de "project_id":xx n'est pas assigné à ProjectID.

La version de fastjson est1.1.15

Deuxième, l'application sur les méthodes setter et getter Ce mode est conforme aux attentes pendant l'utilisation.

/**lors de la conversion bean vers json, ProjectID est converti en project_id */
  @JSONField(name="project_id")
  public Long getProjectID() {
    return ProjectID;
  }
/**lors de la conversion json vers bean, la valeur de project_id dans json est assignée à projectID*/
  @JSONField(name="project_id")
  public void setProjectID(Long projectID) {
    ProjectID = projectID;
  }

Troisième, d'autres utilisations de @JSONField, consultez le code source de l'annotation @JSONField, en plus de name, format, serialize, deserialize, serialzeFeatures et parseFeatures sont disponibles

•format,Il semble que cela soit utile pour formatter les formats de date pour les champs de type Date.

•serializeet deserialize sont de type booléen, l'utilisation est la suivante

@JSONField(serialize=false) 
private Long ProjectID

C'est-à-dire qu'il ne contient pas ce champ lors de la sérialisation. La désérialisation fonctionne à l'inverse. Cependant, il faut noter que, selon d'autres sources, l'annotation n'a pas d'effet lorsque le champ est final, elle doit être placée sur le get

ou sur la méthode set.

•serialzeFeaturesj'utilise cette propriété, par défaut, la règle de sérialisation de fastjson n'inclut pas ce champ lorsque la valeur du champ est null, par exemple, j'ai besoin de cette fonctionnalité

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

Un objet sérialisé de cette manière, mon code est le suivant

CriteriaVO criteriaVO = new CriteriaVO();
    criteriaVO.setFieldName("project_id");
    criteriaVO.setOperator("is not");
    criteriaVO.setValue(null);

Par défaut, il ne sérialise que le résultat suivant

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

Bien sûr, fastjson vous permet également de contrôler les règles de sérialisation.

C'est là que intervient SerializerFeature, un ensemble d'indices, qui contient plusieurs valeurs, et les détails peuvent être consultés par ceux qui sont intéressés

Je n'ai utilisé qu'un seul d'entre eux

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

De cette manière, lorsque la valeur de value est null, elle sera toujours sérialisée. Voici le résultat suivant, c'est ce que je veux obtenir

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

Je me suis encore retrouvé face à un autre problème, lorsque le type de champ est int, comme

private int start;
private int limit;

Si je n'assigne pas de valeur, il sera sérialisé comme suit

"limit":0,"start":0

Par défaut, elles sont toutes à 0, mais mon objectif est qu'elles ne s'affichent pas si elles ne sont pas définies.

Je l'ai fait simplement en changeant leur type en Integer. Il devrait y avoir d'autres méthodes pour résoudre cela en personnalisant le comportement de sérialisation, mais je n'y ai pas prêté attention.

Voici donc la totalité du contenu que je partage avec vous concernant les questions sur l'annotation @JSONField de fastjson (détails). J'espère que cela vous servira de référence et que vous continuerez à soutenir le tutoriel Néhémie.

Vous pourriez aussi aimer