Java Json到列表列表

时间:2017-04-10 19:12:26

标签: java json gson

有一个Float值列表作为Json,如何获得List<List<Float>>

我尝试过类似的事情:

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]。我的代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

您不需要定义自己的包装类,您可以直接使用>>> df2[df1.columns & df2.columns] a b 0 1.952230 -0.641574 1 0.804606 -1.509773 2 -0.360106 0.939992 3 0.471858 -0.025248 4 -0.663493 2.031343 >>> df2.loc[:, df1.columns] a b 0 1.952230 -0.641574 1 0.804606 -1.509773 2 -0.360106 0.939992 3 0.471858 -0.025248 4 -0.663493 2.031343 类型标记,如下所示:

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。相反,它是包含 a List的类的List

答案 1 :(得分:0)

azurefrog的答案非常适合您的问题。您还可以考虑切换到另一个目标反序列化类型。基本原理:List<List<Float>>实际上是一个浮动包装列表的列表,其中每个包装器在JVM堆中保存一个浮点值,而float[][]是一个基本浮点数组的数组,其中每个浮点值都没有需要一个包装盒,用于堆中的单个浮点值(您可以将基元数组视为具有普通存储器布局的一系列值),从而节省内存,使其更加“积极”消耗。这是描述对象和基元之间差异的good Q/A。当然,你不会看到微小阵列的显着差异,但是如果你想尝试它,你甚至不需要类型令牌(因为数组,不像泛型,允许.class表示法):

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