Gsongson在线解析json出问题了,求助

Gson全解析(上)-Gson基础 - 简书
Gson全解析(上)-Gson基础
更多及时技术资讯,欢迎关注我的微博 :
gson github地址/
本篇文章是基于Gson官方使用指导()以及Gson解析的优秀外文(来自 )做出的一个翻译和归纳。博客原链接:
最近在研究Retrofit中使用的Gson的时候,发现对Gson的一些深层次的概念和使用比较模糊,所以这里做一个知识点的归纳整理。
Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。而JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,广泛应用于各种数据的交互中,尤其是服务器与客户端的交互。
Serialization:序列化,使Java对象到Json字符串的过程。
Deserialization:反序列化,字符串转换成Java对象。
JSON数据中的JsonElement有下面这四种类型:
JsonPrimitive —— 例如一个字符串或整型JsonObject—— 一个以 JsonElement 名字(类型为
String)作为索引的集合。也就是说可以把 JsonObject 看作值为 JsonElement 的键值对集合。JsonArray—— JsonElement 的集合。注意数组的元素可以是四种类型中的任意一种,或者混合类型都支持。JsonNull—— 值为null
Gson解决的问题
提供一种像toString()和构造方法的很简单的机制,来实现Java 对象和Json之间的互相转换。
允许已经存在的无法改变的对象,转换成Json,或者Json转换成已存在的对象。
允许自定义对象的表现形式
支持任意的复杂对象
能够生成可压缩和可读的Json的字符串输出。
Gson处理对象的几个重要点
1 推荐把成员变量都声明称private的
2 没有必要用注解(@Expose 注解)指明某个字段是否会被序列化或者反序列化,所有包含在当前类(包括父类)中的字段都应该默认被序列化或者反序列化
3 如果某个字段被 transient 这个Java关键词修饰,就不会被序列化或者反序列化
4 下面的实现方式能够正确的处理null1)当序列化的时候,如果对象的某个字段为null,是不会输出到Json字符串中的。2)当反序列化的时候,某个字段在Json字符串中找不到对应的值,就会被赋值为null
5 如果一个字段是 synthetic的,他会被忽视,也即是不应该被序列化或者反序列化
6 内部类(或者anonymous class(匿名类),或者local class(局部类,可以理解为在方法内部声明的类))的某个字段和外部类的某个字段一样的话,就会被忽视,不会被序列化或者反序列化
Gson中的一些注解
@SerializedName注解
该注解能指定该字段在JSON中对应的字段名称
public class Box {
@SerializedName("w")
@SerializedName("h")
@SerializedName("d")
// Methods removed for brevity
也就是说{"w":10,"h":20,"d":30} 这个JSON 字符串能够被解析到上面的width,height和depth字段中。
@Expose注解
该注解能够指定该字段是否能够序列化或者反序列化,默认的是都支持(true)。
public class Account {
@Expose(deserialize = false)
private String accountN
@Expose(serialize = false)
@Expose(serialize = false, deserialize = false)
需要注意的通过 builder.excludeFieldsWithoutExposeAnnotation()方法是该注解生效。
final GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
final Gson gson = builder.create();
3 @Since和@Until注解
Since代表“自从”,Until 代表”一直到”。它们都是针对该字段生效的版本。比如说
@Since(1.2)代表从版本1.2之后才生效,@Until(0.9)代表着在0.9版本之前都是生效的。
public class SoccerPlayer {
@Since(1.2)
private int shirtN
@Until(0.9)
private String teamN
// Methods removed for brevity
也就是说我们利用方法builder.setVersion(1.0)定义版本1.0,如下:
final GsonBuilder builder = new GsonBuilder();
builder.setVersion(1.0);
final Gson gson = builder.create();
final SoccerPlayer account = new SoccerPlayer();
account.setName("Albert Attard");
account.setShirtNumber(10); // Since version 1.2
account.setTeamName("Zejtun Corinthians");
account.setCountry("Malta"); // Until version 0.9
final String json = gson.toJson(account);
System.out.printf("Serialised (version 1.0)%n
%s%n", json);
由于shirtNumber和country作用版本分别是1.2之后,和0.9之前,所以在这里都不会得到序列化,所以输出结果是:
Serialised (version 1.0)
{"name":"Albert Attard","teamName":"Zejtun Corinthians"}
Gson 序列化
英文Serialize和format都对应序列化,这是一个Java对象到JSON字符串的过程。接着看一个例子,下面分别是java类和以及我们期望的JSON数据:
public class Book {
private String[]
private String isbn10;
private String isbn13;
//为了代码简洁,这里移除getter和setter方法等
"title": "Java Puzzlers: Traps, Pitfalls, and Corner Cases",
"isbn-10": "X",
"isbn-13": "978-",
"authors": [
"Joshua Bloch",
"Neal Gafter"
你肯定能发现JSON数据中出现了isbn-10和isbn-13, 我们怎么把字段数据isbn10和isbn13转化为JSON数据需要的isbn-10和isbn-13,Gson当然为我们提供了对应的解决方案
1 序列化方案1
采用上面提到的@SerializedName注解。
public class Book {
private String[]
@SerializedName("isbn-10")
private String isbn10;
@SerializedName("isbn-13")
private String isbn13;
//为了代码简洁,这里移除getter和setter方法等
2 序列化方案2
利用JsonSerializer类
public class BookSerialiser implements JsonSerializer {
public JsonElement serialize(final Book book, final Type typeOfSrc, final JsonSerializationContext context) {
final JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("title", book.getTitle());
jsonObject.addProperty("isbn-10", book.getIsbn10());
jsonObject.addProperty("isbn-13", book.getIsbn13());
final JsonArray jsonAuthorsArray = new JsonArray();
for (final String author : book.getAuthors()) {
final JsonPrimitive jsonAuthor = new JsonPrimitive(author);
jsonAuthorsArray.add(jsonAuthor);
jsonObject.add("authors", jsonAuthorsArray);
return jsonO
下面对序列化过程进行大致的分析:
JsonSerializer是一个接口,我们需要提供自己的实现,来满足自己的序列化要求。
public interface JsonSerializer&T& {
*Gson 会在解析指定类型T数据的时候触发当前回调方法进行序列化
* @param T 需要转化为Json数据的类型,对应上面的Book
* @return 返回T指定的类对应JsonElement
public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context);
首先在上面的代码中,我们需要创建的是一个JsonElement对象,这里对应Book是一个对象,所以创建一个JsonObject类型。final JsonObject jsonObject = new JsonObject();
然后我们将相应字段里面的数据填充到jsonObject里面。jsonObject.addProperty...
jsonObject.add...
下面是jsonObject中的添加方法:
所以最后返回的还是一个JsonElement 类型,这里对应的是jsonObject。完成了javaBean-&JSON数据的转化。
同样需要配置,
// Configure GSON
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Book.class, new BookSerialiser());
gsonBuilder.setPrettyPrinting();
final Gson gson = gsonBuilder.create();
final Book javaPuzzlers = new Book();
javaPuzzlers.setTitle("Java Puzzlers: Traps, Pitfalls, and Corner Cases");
javaPuzzlers.setIsbn10("X");
javaPuzzlers.setIsbn13("978-");
javaPuzzlers.setAuthors(new String[] { "Joshua Bloch", "Neal Gafter" });
// Format to JSON
final String json = gson.toJson(javaPuzzlers);
System.out.println(json);
,这里对应的是gsonBuilder.registerTypeAdapter(Book.class, new BookSerialiser())方法进行JsonSerializer的配置。在上面例子中,通过调用gsonBuilder.setPrettyPrinting();方法还告诉了 Gson 对生成的 JSON 对象进行格式化
Gson 反序列化
英文parse和deserialise对应反序列化,这是一个字符串转换成Java对象的过程。我们同样采用上面一小节的代码片段,只不过现在我们需要做的是将:
"title": "Java Puzzlers: Traps, Pitfalls, and Corner Cases",
"isbn-10": "X",
"isbn-13": "978-",
"authors": [
"Joshua Bloch",
"Neal Gafter"
转化为对应的Book实体类,
1 反序列化方案1
利用@SerializedName
注解也就是说我们的实体类Book.java可以这么写:
public class Book {
private String[]
@SerializedName("isbn-10")
private String isbn10;
@SerializedName(value = "isbn-13", alternate = {"isbn13","isbn.13"})
private String isbn13;
//为了代码简洁,这里移除getter和setter方法等
可以看到这里我们在@SerializedName
注解使用了一个value, alternate字段,value也就是默认的字段,对序列化和反序列化都有效,alternate只有反序列化才有效果。也就是说一般服务器返回给我们JSON数据的时候可能同样的一个图片,表示"image","img","icon"等,我们利用@SerializedName
中的alternate字段就能解决这个问题,全部转化为我们实体类中的图片字段。
2 反序列化方案2
我们在序列化的时候使用的是JsonSerialize ,这里对应使用JsonDeserializer我们将解析到的json数据传递给Book的setter方法即可。
public class BookDeserializer implements JsonDeserializer&Book& {
public Book deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
final JsonElement jsonTitle = jsonObject.get("title");
final String title = jsonTitle.getAsString();
final String isbn10 = jsonObject.get("isbn-10").getAsString();
final String isbn13 = jsonObject.get("isbn-13").getAsString();
final JsonArray jsonAuthorsArray = jsonObject.get("authors").getAsJsonArray();
final String[] authors = new String[jsonAuthorsArray.size()];
for (int i = 0; i & authors. i++) {
final JsonElement jsonAuthor = jsonAuthorsArray.get(i);
authors[i] = jsonAuthor.getAsString();
final Book book = new Book();
book.setTitle(title);
book.setIsbn10(isbn10);
book.setIsbn13(isbn13);
book.setAuthors(authors);
和Gson序列化章节一样,我们这里接着分析我们是怎么将JSON数据解析(反序列化)为实体类的:
因为我们可以发现上面的JSON数据是一个{}大括号包围的,也就意味着这是一个Json对象。所以首先我们通过final JsonObject jsonObject = json.getAsJsonObject();将我们的JsonElement转化为JsonObject
通过jsonObject.get("xxx").getAsString()的形式获取相应String的值
通过jsonObject.get("xx").getAsJsonArray();获取相应的json数组,并遍历出其中的相应字段值
通过setter方法,将获取到的值设置给Book类。
最终返回的是 Book的对象实例。完成了JSON-&javaBean的转化
同样需要配置
关于从本地流中读取Json数据可以使用
InputStreamReader完成
// Configure Gson
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Book.class, new BookDeserializer());
Gson gson = gsonBuilder.create();
// The JSON data
try(Reader reader = new InputStreamReader(Main.class.getResourceAsStream("/part1/sample.json"), "UTF-8")){
// Parse JSON to Java
Book book = gson.fromJson(reader, Book.class);
System.out.println(book);
翻译原文,根据原文做出了较大改动。1 2 3 4 5 6
另附: 系列文章
主页:/Came...Gson解析出问题,求解_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:582,132贴子:
Gson解析出问题,求解收藏
这个是文件的源地址这个文件里他有不一样的标签
要怎么解决呢。还在学习阶段,各位帮帮我Gson gson = new Gson();Classify fromJson = gson.fromJson(data, Classify.class);
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或2016年10月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。问题:Gson解析异常,请求大神解惑,感激不尽啊
描述:android&&&&GsonJsonJava
02-20&21:26:26.118:&I/Timeline(21380):&Timeline:&Activity_launch_request&id:com.gupian1999&time:
02-20&21:26:26.348:&V/SlidingMenu(21380):&setting&padding!
02-20&21:26:26.468:&V/CustomViewBehind(21380):&behind&INVISIBLE
02-20&21:26:26.558:&D/AndroidRuntime(21380):&Shutting&down&VM
02-20&21:26:26.558:&W/dalvikvm(21380):&threadid=1:&thread&exiting&with&uncaught&exception&(group=0x41645d58)
02-20&21:26:26.568:&E/AndroidRuntime(21380):&FATAL&EXCEPTION:&main
02-20&21:26:26.568:&E/AndroidRuntime(21380):&Process:&com.gupian1999,&PID:&21380
02-20&21:26:26.568:&E/AndroidRuntime(21380):&com.google.gson.JsonSyntaxException:&java.lang.IllegalStateException:&Expected&BEGIN_OBJECT&but&was&BEGIN_ARRAY&at&line&1&column&71
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.Gson.fromJson(Gson.java:803)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.Gson.fromJson(Gson.java:768)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.Gson.fromJson(Gson.java:717)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.Gson.fromJson(Gson.java:689)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.gupian1999.activity.GuZhiActivity$3.onSuccess(GuZhiActivity.java:170)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.lidroid.xutils.http.HttpHandler.onProgressUpdate(HttpHandler.java:218)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.lidroid.xutils.task.PriorityAsyncTask$InternalHandler.handleMessage(PriorityAsyncTask.java:385)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&android.os.Handler.dispatchMessage(Handler.java:102)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&android.os.Looper.loop(Looper.java:136)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&android.app.ActivityThread.main(ActivityThread.java:5095)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&java.lang.reflect.Method.invokeNative(Native&Method)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&java.lang.reflect.Method.invoke(Method.java:515)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&dalvik.system.NativeStart.main(Native&Method)
02-20&21:26:26.568:&E/AndroidRuntime(21380):&Caused&by:&java.lang.IllegalStateException:&Expected&BEGIN_OBJECT&but&was&BEGIN_ARRAY&at&line&1&column&71
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& at&com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
02-20&21:26:26.568:&E/AndroidRuntime(21380):& ...&17&more
以上是错误logcat
二.这是实体类
package&com.gupian1999.
import&java.io.S
import&java.util.ArrayL
public&class&GuZhi&implements&Serializable{
private&static&final&long&serialVersionUID&=&1L;
private&String&error_
private&String&
private&Result&
//ArrayList&Result&&
public&class&&Result&implements&Serializable{
private&static&final&long&serialVersionUID&=&1L;
private&String&dealN
private&String&dealP
private&String&highP
private&String&
private&String&
private&String&
private&String&openP
private&String&
private&String&yesP
public&String&getDealNum()&{
return&dealN
public&void&setDealNum(String&dealNum)&{
this.dealNum&=&dealN
public&String&getDealPri()&{
return&dealP
public&void&setDealPri(String&dealPri)&{
this.dealPri&=&dealP
public&String&getHighPri()&{
return&highP
public&void&setHighPri(String&highPri)&{
this.highPri&=&highP
public&String&getLowpri()&{
public&void&setLowpri(String&lowpri)&{
this.lowpri&=&
public&String&getName()&{
public&void&setName(String&name)&{
this.name&=&
public&String&getNowpri()&{
public&void&setNowpri(String&nowpri)&{
this.nowpri&=&
public&String&getOpenPri()&{
return&openP
public&void&setOpenPri(String&openPri)&{
this.openPri&=&openP
public&String&getTime()&{
public&void&setTime(String&time)&{
this.time&=&
public&String&getYesPri()&{
return&yesP
public&void&setYesPri(String&yesPri)&{
this.yesPri&=&yesP
public&String&getError_code()&{
return&error_
public&void&setError_code(String&error_code)&{
this.error_code&=&error_
public&String&getReason()&{
public&void&setReason(String&reason)&{
this.reason&=&
public&Result&getResult()&{
public&void&setResult(Result&result)&{
this.result&=&
三.获取的json利用gson解析成实体类,代码如下
gson&=&new&Gson();
GuZhi&sGuZhi&=&gson.fromJson(responseInfo.result,&GuZhi.class);
System.out.println(sGuZhi.toString());
setShenDatas(sGuZhi);
四.下面是数据的使用
//&设置上证的数据
private&void&setSZDatas(GuZhi&sGuZhi)&{
Result&result=&sGuZhi.getResult();
tv_sz_nowpri.setText(FomatNumUtil.fomatNum(result.getYesPri()));
info1_dealNum.setText(FomatNumUtil.fomatNum(result.getDealNum()));
info1_dealMon.setText(FomatNumUtil.fomatNum(result.getDealPri()));
info1_highPri.setText(FomatNumUtil.fomatNum(result.getHighPri()));
info1_lowpri.setText(FomatNumUtil.fomatNum(result.getLowpri()));
info1_nowpri.setText(FomatNumUtil.fomatNum(result.getNowpri()));
info1_openPri.setText(FomatNumUtil.fomatNum(result.getOpenPri()));
info1_yesPri.setText(FomatNumUtil.fomatNum(result.getYesPri()));
info1_time.setText(result.getTime());
double&now&=&Double.parseDouble(result.getNowpri());
double&yes&=&Double.parseDouble(result.getYesPri());
DecimalFormat&df&=&new&DecimalFormat("######0.00");
//System.out.println(now&-&yes);
tv_sz_nowpri_yespri.setText(FomatNumUtil.fomatNum(df.format(now-yes)));
}解决方案1:
你设置的类有问题吧?GuZhi中嵌套了类Result?你吧result类单独拿出来吧。关键是看看你的responseInfo.result是一个什么数据。
解决方案2:
这个错误是&要解析的json数据是集合类型的,你解析是不是按集合类型解析的,所以报错了,你要看看服务器返回的json数据是怎样的才行。。。
以上介绍了“Gson解析异常,请求大神解惑,感激不尽啊”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/645977.html
上一篇: 下一篇:}

我要回帖

更多关于 gson 解析数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信