Skip to main content
 首页 » 编程设计

java之如何用Gson反序列化未知维度的数组

2024年07月26日29落叶无声

我尝试使用

.fromJson(mystring, Object.class); 

但是得到了嵌套的ArrayList。

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

这可能吗?

更新

我编写了以下自定义适配器

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)。

请您参考如下方法:

我会使用列表,因为它们没有设定的长度:

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此过程的网站(无隶属关系)