2017-04-10 123 views
0

有一个Float值列表的列表作为Json,怎么可能得到List<List<Float>>Java Json到列表清单

我想是这样的:

class MyLine{ 
    List<Float> values; 
} 
String firstData = "[[0.11492168, -0.30645782, 9.835381], [0.12449849, -0.29688102, 9.844957]]" 
Gson gson = new Gson(); 
List<MyLine> firstList = gson.fromJson(firstData, new TypeToken<List<MyLine>>(){}.getType()); 

,但我有一个错误Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 3 path $[0]。我的代码有什么问题?

+0

用过gson吗? – Remario

+0

是你的字符串中有效的JSON? –

+0

@jackjay是的 – littlewombat

回答

2

你并不需要定义自己的包装类,你可以直接使用一个类型的标记List<List<Float>>像这样:

String firstData = "[[0.11492168, -0.30645782, 9.835381], [0.12449849, -0.29688102, 9.844957]]"; 
Gson gson = new Gson(); 
List<List<Float>> firstList = gson.fromJson(firstData, new TypeToken<List<List<Float>>>() {}.getType()); 

System.out.println(firstList); 
// prints [[0.11492168, -0.30645782, 9.835381], [0.12449849, -0.29688102, 9.844957]] 

一个List<MyLine>实际上不是一个List<List<Float>>除非MyLine本身就是一个List 。相反,这是包含 a List<Float>的类的List

0

azurefrog的答案非常适合您的问题。您也可以考虑切换到另一个目标反序列化类型。理由:List<List<Float>>实际上是浮动包装列表的列表,其中每个包装在您的JVM堆中分隔浮动值,而float[][]是基本浮动数组的数组,其中每个浮动值不需要用于单个浮动的包装箱堆中的值(您可以将一系列基元看作一系列具有普通内存布局的值),从而使内存不再受到“积极”消耗的影响。以下是描述对象和基元之间差异的good Q/A。当然,对于微型阵列你不会看到明显的区别,但是如果你想尝试它,你甚至不需要类型标记(因为与泛型不同,阵列允许.class表示法):

final float[][] values = gson.fromJson(firstData, float[][].class); 
...