2016-03-16 3 views
0

На этот раз я играю вокруг с mongodb. Я знаю, как вставлять документы, обновление, формат json и т. Д. В последнее время я создал класс хранения данных со строковым свойством javafx, чтобы показать результат запросов в виде таблицы. Таким образом, проблема заключается в том, что если я сохраню класс в mongodb, он сохранит свойство как объект с тремя значениями (свойство, значение, действительный). Есть ли возможность сохранить его как ключ: значение, как обычная строка? Проблема с объектом заключается в том, что запрос намного сложнее, чем ключ: ценность.Сохранение свойств javafx в mongodb

Сначала я создаю свой объект, конвертирую его в json с помощью библиотеки gson Google и затем сохраняю его через класс документа в базе данных.

Минимальный пример: Класс данных

public class DatabaseEntry { 

private String companyName; 
private int _id; 
private int emploees; 
private ArrayList<Contact> contacts = new ArrayList(); 
private ArrayList<Invoice> invoices = new ArrayList(); 
private StringProperty testString = new SimpleStringProperty(); 

public DatabaseEntry(String companyName, int emploees, int _id, String test){ 
    this.companyName=companyName; 
    this.emploees=emploees; 
    this._id=_id; 
    this.testString.setValue(test); 
} 

Основной класс;

public class MongoDB { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     DatabaseEntry entry = new DatabaseEntry("toolhouse", 18, 16,"Property"); 
     System.out.println(new Gson().toJson(objToSave)); 
    } 
} 

Выход:

"СравниваемаяСтрока": { "имя": "", "значение": "Недвижимость", "действует" ложь}

+0

Правильно ли я говорю, что mongodb немного не имеет отношения к вопросу, и непосредственной проблемой, которую вы пытаетесь решить, является: «Как использовать gson для сериализации и десериализации свойств из класса JavaFX как пары ключ/значение json, а не свойства/значение/допустимые объекты? ". Кроме того, несмотря на то, что вы не упомянули об этом, я предполагаю, что ObservableLists также представит вам похожие проблемы сериализации/десериализации? Вы можете добавить [mcve] (http://stackoverflow.com/help/mcve) для этой части: «Я создаю свой объект, конвертирую его в json с помощью Google gson library». – jewelsea

+0

Я добавил mcve. Да, вы правы, что mongodb не имеет ничего общего с сохранением json-формата ... Но я хочу упомянуть об этом, потому что может быть решение для сборки, или у кого-то есть эта проблема, и решить ее с помощью некоторой функции mongodb. – Steinliiippp

+0

Любой, у кого есть решение? – Steinliiippp

ответ

0

Вам нужно зарегистрировать GSON type adapter выполнить выборочную сериализации и десериализации объекта:

StringPropertyAdapter.java

import com.google.gson.*; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

import java.lang.reflect.Type; 

public class StringPropertyAdapter implements 
     JsonSerializer<StringProperty>, 
     JsonDeserializer<StringProperty> { 
    @Override 
    public JsonElement serialize(
      StringProperty property, 
      Type type, 
      JsonSerializationContext jsonSerializationContext 
    ) { 
     return new JsonPrimitive(
       property.getValue() 
     ); 
    } 

    @Override 
    public StringProperty deserialize(
      JsonElement json, 
      Type type, 
      JsonDeserializationContext jsonDeserializationContext 
    ) throws JsonParseException { 
     return new SimpleStringProperty(
       json.getAsJsonPrimitive().getAsString() 
     ); 
    } 
} 

PropertySerializationTest.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import javafx.beans.property.StringProperty; 

public class PropertySerializationTest { 
    public static void main(String[] args) { 
     final DatabaseEntry entry = new DatabaseEntry("toolhouse", 18, 16, "Property"); 
     final GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(StringProperty.class, new StringPropertyAdapter()); 
     final Gson gson = gsonBuilder.create(); 

     System.out.println("Serialized Data:"); 
     String json = gson.toJson(entry); 
     System.out.println(json); 

     System.out.println("De-serialized/Re-serialized Data:"); 
     DatabaseEntry rebuiltEntry = gson.fromJson(json, DatabaseEntry.class); 
     String rebuiltJson = gson.toJson(rebuiltEntry); 
     System.out.println(rebuiltJson); 
    } 
} 

DatabaseEntry.java

import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

public class DatabaseEntry { 

    private String companyName; 
    private int _id; 
    private int employees; 
    private StringProperty testString = new SimpleStringProperty(); 

    public DatabaseEntry(String companyName, int employees, int _id, String test) { 
     this.companyName = companyName; 
     this.employees = employees; 
     this._id = _id; 
     this.testString.setValue(test); 
    } 
} 

Программа выходного

Serialized Data: 
{"companyName":"toolhouse","_id":16,"employees":18,"testString":"Property"} 
De-serialized/Re-serialized Data: 
{"companyName":"toolhouse","_id":16,"employees":18,"testString":"Property"} 
+0

Спасибо, он работал очень хорошо. В следующий раз я должен посмотреть глубже в api ... Сначала я мог справиться с этим с интерфейсом Externasizable, но json не использовал java-путь. – Steinliiippp

Смежные вопросы