2017-05-30 49 views
3

我試圖用如何使用Gson反序列化未知維數組?

.fromJson(mystring, Object.class); 

,但得到的嵌套的ArrayList-S。

我想嵌套double[][]...[]

這可能嗎?

UPDATE

我寫了下面的自定義適配器

public class DoubleArrayAdapter extends TypeAdapter<Object> { 


    @Override 
    public void write(JsonWriter out, Object value) throws IOException { 

     if(value.getClass().isArray()) { 
     out.beginArray(); 
     int length = Array.getLength(value); 
     for (int i = 0; i < length; i ++) { 
      Object arrayElement = Array.get(value, i); 
      write(out, arrayElement); 
     } 
     out.endArray(); 
     } 
     else { 
     out.value((double) value); 
     } 

    } 

    @Override 
    public Object read(JsonReader in) throws IOException { 
     if(in.peek() == JsonToken.BEGIN_ARRAY) { 
     ArrayList<Object> elements = new ArrayList<>(); 
     in.beginArray(); 
     do { 
      elements.add(read(in)); 
     } while(in.peek() != JsonToken.END_ARRAY); 
     in.endArray(); 

     if(elements.size() == 0) { 
      return new double[0]; 
     } 
     else { 
      Class cls = elements.get(0).getClass(); 
      if(cls.isArray()) { 
       Object ans = Array.newInstance(cls, elements.size()); 
       for(int i=0; i<elements.size(); ++i) { 
        Array.set(ans, i, elements.get(i)); 
       } 
       return ans; 
      } 
      else { 
       double[] ans = new double[elements.size()]; 
       for(int i=0; i<elements.size(); ++i) { 
        ans[i] = (double) elements.get(i); 
       } 
       return ans; 
      } 
     } 
     } 
     else { 
     return in.nextDouble(); 
     } 
    } 
} 

,並準備GSON對象用下面的代碼

public static Gson getGsonWithDoubleArrayAdapter() { 
     if(gson == null) { 
     gson = new GsonBuilder() 
      .serializeNulls() 
      .setPrettyPrinting() 
      .registerTypeAdapter(Object.class, new DoubleArrayAdapter()) 
      .create(); 
     } 
     return gson; 
    } 

但看起來並不仍然激活(仍生成ArrayList-s)。

+0

什麼是烏拉圭回合目前的ArrayList的類型? – Salman

+1

@Salman只是'ArrayList'。我只在運行時看到它。 – Dims

+1

不幸的是,你不能在Gson中重寫'java.lang.Object'的反序列化。 –

回答

0

我會用列表來代替,因爲他們沒有一套長度:

Gson gson = new Gson(); 
ClassName download = gson.fromJson(input, ClassName.class); // creates POJO from input, into a ClassName object 

在這樣一種方式,ClassName類似於:

public class ClassName { 
    String name;  

    List<ObjInList> list; 
}  

public class ObjInList { 
    String description; 
    float price; 
} 

我還建議this網站對於此過程(無隸屬關係)

+0

*我會使用列表,因爲它們沒有設置長度*。你完全無視這個問題。很明顯OP已經有了列表,但是需要數組。爲什麼你會認爲可變長度是一個要求呢? – shmosel

0

首先,我在我的廣告中發現了一個錯誤比較容易,它應該是

if(in.peek() == JsonToken.BEGIN_ARRAY) { 
     ArrayList<Object> elements = new ArrayList<>(); 
     in.beginArray(); 
     do { 
      elements.add(read(in)); 
     } while(in.peek() != JsonToken.END_ARRAY); 
     in.endArray(); 

ANS後來也

if(cls.isArray()) { 
      Object ans = Array.newInstance(cls, elements.size()); 
      for(int i=0; i<elements.size(); ++i) { 
       Array.set(ans, i, elements.get(i)); 
      } 
      return ans; 
     } 

等。

然後我分析的字符串與此適配器直接,蒙山代碼

new DoubleArrayAdapter().fromJson(new StringReader(mystring));