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

fastjsonの@JSONFieldアノテーションのいくつかの問題(詳細)

@JSONField

ソースコードを見ると、フィールドやメソッド上に作用することができます。

引用網上說的、

一、作用Field

@JSONFieldがFieldに作用する場合、nameは入力キーの名前だけでなく、出力名も定義します。

しかし、私の使用では、それほど期待通りではありませんでした。

例えば

@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型のフィールドの時間フォーマットをフォーマットするのに非常に役立ちます。

•serializeserializeおよび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);

デフォルトでは、以下のような結果にシリアライズされます

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

もちろん、fastjsonはシリアライズのルールをある程度制御することができます。

これはSerializerFeatureを使用しています。これはエnumerationで、いくつかの値があります。具体的な意味に関心がある場合は、確認してください

私はそのうちの一つを使っていただけました

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

valueの値がnullの場合、それでもその値がシリアライズされます。以下のようになります。これが私が望む結果です

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

もう一つの問題に直面しました。フィールドのタイプがintの場合、例えば

private int start;
private int limit;

値を設定しない場合、以下のようにシリアライズされます

"limit":0,"start":0

デフォルトではすべて0に設定されていますが、私の目標は値を設定しない場合にそれらが表示されないようにすることです。

私は単に彼らのタイプをIntegerに変更することで簡単にしました。他のカスタムシリアライズ行為を通じて解決する方法もありましたが、今は研究しません。

以上のfastjsonの@JSONFieldアノテーションに関するいくつかの質問(詳細)が、編集者が皆さんに共有した全ての内容です。皆さんに参考になれば幸いですし、呐喊ガイドを多くのサポートをお願いします。

おすすめ