2017-05-30 6 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(); 
     } 
    } 
} 

を書いて、次のコード

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

でGsonオブジェクトを準備する。しかし、それはそれにもかかわらず活性化しないように見えますArrayList-sを生成します)。このように

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

whith、直接このアダプタで文字列を解析されましたか? – Salman

+1

@Salmanちょうど 'ArrayList'です。私は実行時にそれを見るだけです。 – Dims

+1

残念ながら、Gsonで 'java.lang.Object'デシリアライズをオーバーライドすることはできません。 –

答えて

0

私は、代わりにリストを使用しますこのプロセスのために(所属なし)

+0

*リストの代わりに、長さが設定されていない*を使用します。あなたは完全にその質問を無視している。明らかにOPにはリストがありますが、配列が必要です。とにかく、可変長は必須条件だと思いますか? – shmosel

0

最初に私の広告にバグが見つかりましたapter、それはまた、

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; 
     } 

というようにする必要があります。

そして私はウル現在のArrayListの種類が何であるかをコード

new DoubleArrayAdapter().fromJson(new StringReader(mystring)); 
関連する問題