2017-04-10 87 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); 
...