我尝试使用
.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)。
答案 0 :(得分:0)
我会使用Lists代替,因为它们没有设定的长度:
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网站进行此过程(无关联)
答案 1 :(得分:0)
首先我在我的适配器中发现了一个错误,它应该是
The requested resource does not support http method 'GET'
后来也是
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;
}