如何使用Gson反序列化未知维的数组? - java

我尝试使用

.fromJson(mystring, Object.class);

但是却嵌套了ArrayList-s。

我想嵌套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)。

java大神给出的解决方案

我将使用列表,因为它们没有设置长度:

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网站进行此过程(无从属关系)

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

如何使用BorderLayout(Java)扩展JTextField - java

我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…

查看抽象类的方法是否未被扩展类之一覆盖的方法 - java

我有一个抽象类,比如AbstractClass和扩展该抽象类的多个其他类(700多个)。 AbstractClass有一个方法,比方说baseMethod(),它不是抽象方法。许多类(500+)覆盖该方法并具有自己的实现。现在,通过eclipse,我可以很容易地看到通过Ctrl+Shift+G覆盖该方法的方法,但是除了手动以外,还有其他方法可以看到不覆盖该方…

从较小的字节数组(Java)进行长时间转换 - java

我正在尝试将字节数组转换为long,但是接收到BufferUnderflowException ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); byte[] arg1 = new byte[] {0x04, (byte)0xB0}; buffer.put(arg1, 0, arg1.length); …