【问题标题】:How to deserialize array of unknown dimension with Gson?如何用 Gson 反序列化未知维度的数组?
【发布时间】:2017-10-31 10:18:15
【问题描述】:

我尝试使用

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

【问题讨论】:

  • 你当前的ArrayList是什么类型的?
  • @Salman 只是ArrayList。我只在运行时看到它。
  • 很遗憾,您不能在 Gson 中覆盖 java.lang.Object 反序列化。

标签: java multidimensional-array gson


【解决方案1】:

我会改用列表,因为它们没有固定长度:

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这个过程的网站(无从属关系)

【讨论】:

  • 我会改用列表,因为它们没有固定长度。你完全忽略了这个问题。显然 OP 已经有列表,但想要数组。为什么你会假设可变长度是一个要求?
【解决方案2】:

首先我在我的适配器中发现了一个错误,应该是

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( 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多