2015-10-05 102 views
4

如何正確地序列化TreeSet?爲了讓你知道什麼是不工作的,我已經建立了這個小演示項目。主要目標是打印我的QData對象的JSON字符串。GSON:使用java.util.TreeSet序列化對象

App.java

package de.company.gsonserializer; 

import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.SortedSet; 
import java.util.TreeSet; 

public class App 
{ 
    public static void main(String[] args) 
    { 
     QData qdata = new QData(); 

     ArrayList<LData> arrayList = new ArrayList<LData>(1); 

     LData l = new LData(); 
     Map<String, String> unsortedBuabList = new HashMap<String, String>(); 
     for (int i = 0; i < 5; i++) { 
      unsortedBuabList.put("Key-" + i, "Value" + i); 
     } 
     SortedSet<Map.Entry<String, String>> sortedBuabList = new TreeSet<Map.Entry<String, String>>(
       new Comparator<Map.Entry<String, String>>() { 
        public int compare(Map.Entry<String, String> e1, Map.Entry<String, String> e2) { 
         return e1.getValue().compareTo(e2.getValue()); 
        } 
       }); 
     sortedBuabList.addAll(unsortedBuabList.entrySet()); 
     l.setBuabList(sortedBuabList); 

     arrayList.add(l); 
     qdata.setLocations(arrayList); 

     System.out.println(qdata.toString()); 
    } 
} 

QData.java

package de.it2media.gsonserializer; 

import java.util.ArrayList; 

import com.google.gson.Gson; 

public class QData { 

    private ArrayList<LData> locations = new ArrayList<LData>(0); 

    public ArrayList<LData> getLocations() { 
     return locations; 
    } 

    public void setLocations(ArrayList<LData> locations) { 
     this.locations = locations; 
    } 

    @Override 
    public String toString(){ 
     Gson gson = new Gson(); 
     String thisObj = gson.toJson(this); 
     return thisObj;  
    } 

} 

LData.java

package de.it2media.gsonserializer; 

import java.util.Map; 
import java.util.SortedSet; 
import java.util.TreeSet; 
import java.util.Map.Entry; 

public class LData { 

    private SortedSet<Entry<String, String>> buabList = new TreeSet<Map.Entry<String, String>>(); 

    public SortedSet<Entry<String, String>> getBuabList() { 
     return buabList; 
    } 

    public void setBuabList(SortedSet<Entry<String, String>> buabList) { 
     this.buabList = buabList; 
    } 

} 

輸出:{"locations":[{"buabList":[{},{},{},{},{}]}]}

預計產量會是這樣的:{"locations":[{"buabList":[{"key":"Key-0","value":"Value0"},{"key":"Key-1","value":"Value1"},{"key":"Key-2","value":"Value2"},{"key":"Key-3","value":"Value3"},{"key":"Key-4","value":"Value4"}]}]}

你可能知道爲什麼GSON不工作,我希望它的工作?

感謝您的任何幫助,非常感謝!

回答

4

您遇到的問題與TreeSet無關,而是GSON不知道如何以您想要的方式序列化地圖Entry。因此,你需要編寫自定義序列化它,它看起來是這樣的:

public static class EntrySerializer implements JsonSerializer<Entry<String, String>> { 
    @Override 
    public JsonElement serialize(Entry<String, String> entry, Type typeOfSrc, JsonSerializationContext context) { 
     JsonElement serializedKey = context.serialize(entry.getKey()); 
     JsonElement serializedValue = context.serialize(entry.getValue()); 

     JsonObject jsonObject = new JsonObject(); 
     jsonObject.add("key", serializedKey); 
     jsonObject.add("value", serializedValue); 
     return jsonObject; 
    } 
} 

當您創建Gson對象,則需要註冊自定義序列:

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Entry.class, new EntrySerializer()) 
     .create(); 

你可以閱讀更多關於GSON documentation中的定製串行器和解串器。

+0

工程就像一個魅力,非常感謝你! – Erando