ジャクソン/ GsonシリアライズとJSONにJavaFXのプロパティをデシリアライズ

colmulhall:

私は、JSONにシリアライズすることとMySQLデータベースに保存するサーバに渡って送信することであるDAOクラスにBooleanPropertyを追加しました。私はJavaFXのデスクトップアプリケーションに「のisActive」フィールドのデータバインディングを使用したいので、私はBooleanPropertyを使用していた理由です。

クラスは、直列化されます。

package com.example.myapplication

import lombok.Data;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;

@Data
public class MyDAO {
    private int id;
    private String firstName;
    private String lastname;
    private final BooleanProperty isActive = new SimpleBooleanProperty();
}

私はGsonを使用してJSONにシリアライズしています:

StringEntity entity = new StringEntity(new Gson().toJson(myDTO), "UTF-8");

これは、JSONにシリアライズされますと、それは次のようになります。

{
   "id":0,
   "first_name":"Joe",
   "last_name":"Bloggs",
   "is_active":{
      "name":"",
      "value":false,
      "valid":true

   }
}

逆シリアル化するとき、サーバーがデータベースに保存されるものに対応するようにブール値を想定し、これは、(ジャクソンを使用して)サーバ上の問題を引き起こしています。ちょうど真/偽の値がBooleanPropertyから直列化復元取得する方法はありますか?

これは私がサーバーで見てみたいものです。

{
   "id":0,
   "first_name":"Joe",
   "last_name":"Bloggs",
   "is_active": false,
}
マイケルZiober:

あなたのクライアントアプリケーションが使用するGsonシリアライズへPOJOJSONアプリの使用とサーバーJacksondeserialiseするJSONバックへPOJOどちらの場合も、デフォルトのシリアライズすることにより、これらの2つのライブラリは、通常のようなクラスを提供POJO-s。あなたにはPOJO、あなたが使用しJavaFX Properties、余分な機能を持つ値のラッパーです。あなたはシリアライズするときPOJOJSON、あなたがの内部実装を非表示にする必要があり、時にはPOJO、あなたがカスタムシリアライザを実装するか、使うべき理由ですFX Gsonのライブラリを。

1.カスタムシリアライザ

書き込みカスタムシリアライザにあなたが実装する必要があるcom.google.gson.JsonSerializerインターフェイスを。あなたが例を見ることができますホットそれは次のようになります。

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import lombok.Data;

import java.lang.reflect.Type;

public class GsonApp {

    public static void main(String[] args) {
        MyDAO myDAO = new MyDAO();
        myDAO.setId(1);
        myDAO.setFirstName("Vika");
        myDAO.setLastname("Zet");
        myDAO.getIsActive().set(true);

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(BooleanProperty.class, new BooleanPropertySerializer())
                .setPrettyPrinting().create();
        System.out.println(gson.toJson(myDAO));
    }

}

class BooleanPropertySerializer implements JsonSerializer<BooleanProperty> {
    @Override
    public JsonElement serialize(BooleanProperty src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.getValue());
    }
}

@Data
class MyDAO {
    private int id;
    private String firstName;
    private String lastname;
    private final BooleanProperty isActive = new SimpleBooleanProperty();
}

上記のコードを印刷:

{
  "id": 1,
  "firstName": "Vika",
  "lastname": "Zet",
  "isActive": true
}

2. FX Gson

ケースでは、より多くの種類を使用javafx.beans.property.*用いることであろうパッケージの良いアイデアをFX Gson最も使用されるタイプのためのカスタムserialisersを実装するライブラリを。あなたはただ1つの余分追加する必要があり、依存関係をあなたにMaven POMファイル:

<dependency>
    <groupId>org.hildan.fxgson</groupId>
    <artifactId>fx-gson</artifactId>
    <version>3.1.2</version>
</dependency>

使用例:

import com.google.gson.Gson;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import lombok.Data;
import org.hildan.fxgson.FxGson;

public class GsonApp {

    public static void main(String[] args) {
        MyDAO myDAO = new MyDAO();
        myDAO.setId(1);
        myDAO.setFirstName("Vika");
        myDAO.setLastname("Zet");
        myDAO.getIsActive().set(true);

        Gson gson = FxGson.coreBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(myDAO));
    }

}

上記のコードを印刷:

{
  "id": 1,
  "firstName": "Vika",
  "lastname": "Zet",
  "isActive": true
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=19707&siteId=1