我一直在计划使用simpleXML来满足序列化需求,但是我想尝试使用JSON来学习一些新知识。
这是我用来尝试使用Gson 1.7.1序列化测试POJO的ArrayList的代码。
注意:为了简化代码,我删除了字符串“ s”的读取器/写入器。
package test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gson.Gson;
public class TestGsonSerialDeserialList {
public static void main(String[] args) throws IOException{
Gson gson = new Gson();
//Make Serial
String s;
List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
list.add(new TestObject());
list.add(new TestObject());
s = gson.toJson(list, ArrayList.class);
System.out.println(s);
//Eat Serial
List<TestObject> list2 = Collections.synchronizedList(gson.fromJson(s, ArrayList.class) );
System.out.println(list2.get(0) );
System.out.println(list2.get(1) );
}
}
这是我得到的输出:
[{"html" target="_blank">objectID":1,"i1":12345,"name":"abcdefg","s":["a","b","c"]},{"objectID":2,"i1":12345,"name":"abcdefg","s":["a","b","c"]}]
java.lang.Object@5c74c3aa
java.lang.Object@75d9fd51
在我的新手看来,这看起来是正确的。仅,反序列化的对象列表包含基本对象,而不是TestObject的I序列化。谁能给我解释一下,如果可以的话,我可以做些什么来做这项工作?
编辑:
校正测试:感谢ColinD
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class TestGsonSerialDeserialList {
public static void main(String[] args) throws IOException{
System.out.println("--- Serialize / Deserialize Started ---");
String fileName = "json\\testList.json";
Gson gson = new Gson();
Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
//Make Serial
Writer osWriter = new OutputStreamWriter( new FileOutputStream(fileName));
List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
list.add(new TestObject());
list.add(new TestObject());
list.add(new TestObject());
list.add(new TestObject());
gson.toJson(list, osWriter);
osWriter.close();
//Eat Serial
Reader isReader = new InputStreamReader( new FileInputStream((fileName) ) );
List<TestObject> list2 = Collections.synchronizedList(
(List<TestObject>)gson.fromJson(isReader, listOfTestObject)
);
isReader.close();
System.out.println(list2.get(0) );
System.out.println(list2.get(1) );
System.out.println(list2.get(2) );
System.out.println(list2.get(3) );
System.out.println("--- Serialize / Deserialize Ended ---");
}
}
输出:
--- Serialize / Deserialize Started ---
ID#: 1, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@95c083
ID#: 2, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@6791d8c1
ID#: 3, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@182d9c06
ID#: 4, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@5a5e5a50
--- Serialize / Deserialize Ended ---
编辑2:
老实说,我不知道为什么,但是当我用ArrayList替换嵌入在TestObject中的简单String []时,它开始正确地序列化。
--- Serialize / Deserialize Started ---
ID#: 1, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 2, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 3, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 4, i1: 12345, name: abcdefg, s[]: [a, b, c]
--- Serialize / Deserialize Ended ---
您需要提供有关所使用的特定通用类型List
(或与其一起使用的任何通用类型)的Gson信息。特别是在反序列化JSON时,它需要该信息才能确定将每个数组元素反序列化为哪种类型的对象。
Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
String s = gson.toJson(list, listOfTestObject);
List<TestObject> list2 = gson.fromJson(s, listOfTestObject);
这在Gson用户指南中有所记录。
我对Gson将集合更改为Json对象有问题。这是我的代码: 这是输出: JsonString会被创建,但只会使用最新的对象一次又一次地创建。我做错了什么?
我按照教程的说明创建了一个新项目,在指定的位置更改了两个文件的名称。当我尝试运行它时,AS窗口底部的日志文件显示: 检索项的父项时出错:找不到与给定名称“Android:TextPapearance.Material.Widge.Button.Inverse”匹配的资源。 错误:(2)检索项的父项时出错:找不到与给定名称'Android:Widget.Material.Button.Colored
我正在尝试反序列化类型为 每当我尝试执行 其中类型是使用TypeToken从TypeToken获取的 我认为使用类型会解决我的问题,因为最初我不想使用它,但它没有。感谢任何帮助。
我使用的事件系统基于这个问题中的建议:在Java中创建自定义事件 我在一个组件中实现了它,以从组件上的按钮处理和传递事件。我将组件放入它自己的jar文件中。然后我在另一个项目中使用了组件和jar文件,当我试图运行用它创建的程序时,它给了我以下错误: Java . lang . illegalaccessexception:类事件。EventHandler无法使用修饰符“public”访问类outf
问题内容: 我有一个像这样的POJO,我正在使用GSON序列化为JSON: 这是我的做法: 现在我的json将是这样的: 现在我的问题是:有什么办法可以代替更改变量名呢?在Gson中,我可以在变量顶部使用任何注释吗? 我想要这样的东西: 问题答案: 您可以使用@SerializedName(“ client_id”) 编辑: 您也可以使用它,以通用方式更改所有字段
问题内容: -edit2-3小时后,仍然有相同的问题。我正在使用noinstall存档软件包。-编辑-也许有人可以告诉我一种检查表是否存在的更好方法? 我的函数库中有一个函数来检查是否存在一个表,该表过去我曾问过要怎么做。 我删除了数据库并再次创建了它。我的代码未正确创建表。调试后,我决定编写以下内容。 很奇怪… mydb被删除并再次创建(我写了,应该消失了吗?)。让我们找出存在的东西 我不仅不知