gson怎么解析json里面的gson对象转jsonobject

在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
想试试用Gson来解析json数据
这是data_info
{"careingpeople_id":"33","lovecode":null,"appellation":"父亲","name":"王健林","birthday":"","mobile":"","areano":"320583","communityno":"1","communityname":"测试小区","agency_id":"1","street":"","canselfcare":"0","language":"本地话","disease":"糖尿病","memo":"哈哈","ctime":" 10:22:33"}
这是解析的方法
old_man_info_data = GsonUtil.getInstance().fromJson(data_info, OldManInfoData.class);
其中json数据中有一个字段的值是null
"lovecode":null
此时如果执行如下代码,就会报错
Log.e("这是什么鬼", old_info.getLovecode());
Caused by: java.lang.NullPointerException: println needs a message
想请问一下,有人碰到过类似问题吗?如何解决?
补充:Google了一下,有人说用下边这段代码
gson=new GsonBuilder().serializeNulls().create();
可以解决,但是我试过了,没用。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
贴一个的答案,将null替换成""
import java.lang.reflect.T
public class StringConverter implements JsonSerializer&String&,
JsonDeserializer&String& {
public JsonElement serialize(String src, Type typeOfSrc,
JsonSerializationContext context) {
if ( src == null ) {
return new JsonPrimitive("");
return new JsonPrimitive(src.toString());
public String deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
return json.getAsJsonPrimitive().getAsString();
然后这么用:
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(String.class, new StringConverter());
Gson gson = gb.create();
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这种问题,就是普通的java 空指针,是你的对象是null,调用它的get方法 肯定就会 空指针,补救版本就是 加判断,或者修改数据源
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果服务端配合你,遇到空值改成""空字符串就好。
如果只能本地改那就要每次都要判断,不能用Gson解析
if (dataObject.has("id") && !dataObject.isNull("id")) {
dataObject.getString("id"));
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这根本不是Gson的问题好吧。。。。明明就是你的那个值就是null。所以你的那句
Log.e("这是什么鬼", old_info.getLovecode());
Log.e("这是什么鬼", null);
如果你改成
Log.e("这是什么鬼", old_info.getLovecode()!=null?old_info.getLovecode():"");
就不会错了,错了你打我。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:jackson json 关于序列化与反序列化时json中字段名称的问题
&&& &student_id&: 1
model如下:
class Student {
@JsonProperty(&student_id&)
private int studentId;
public Student() {}
public int getStudentId() {
return studentId;
public void setStudentId(int studentId) {
this.studentId = studentId;
} 这时候使用jackson是可以将json转为此model,
问题是,我再把这个model转成json时,我想变成
&&& &studentId&: 1
===============================================
参考stackoverflow
class Student {
private int studentId;
public Student() {}
@JsonIgnore
public int getStudentId() {
return studentId;
@JsonProperty(&student_id&)
public void setStudentId(int studentId) {
this.studentId = studentId;
@JsonProperty(&studentId&)
public int getJavaStudentId() {
return studentId;
大概就是类字段或该字段所在的get和set其中一个被@JsonProperty标注了,序列化反序列化都统一了。
当再写一个get方法时,若被@JsonProperty标注了,反序列化时,就会多出这个字段。
所以正宗的get上要加个@JsonIgnore。
& & 没有看源码。。。就这样猜的
class Student {
@JsonIgnore
private int studentId;
public Student() {}
@JsonProperty(&studentId&)
public int getStudentId() {
return studentId;
@JsonProperty(&student_id&)
public void setStudentId(int studentId) {
this.studentId = studentId;
大概是这样,我没试过,你自己参考吧。
--- 共有 6 条评论 ---
: 2.1.1版本不行,需要2.8.1
: 贴出来你最终的做法给大家参考下吧。
: 按照原帖子成功了,你贴的跟原帖有差异
: 只做参考,stackoverflow上那人说成功了。
: 稍等,我少看到你字段上的@JsonIgore
private是不行的。public 试试。
--- 共有 2 条评论 ---
只要get和set的方法是public即可,一般bean中的属性都设置为private,只能够通过get和set对他进行操作,这样提高安全性
private也是可以的
请楼主查看alibaba 的 fastjson (一个java类库)中 的 注解
@JSONField的使用。
试试 Google 的 Json 转换工具 ,可以将 JSON 和 Java 对象相互转化,使用方法非常简单。
Jackson的作者估计也没想到你这个使用场景。JsonProperty注解的信息,没办法处理了。
再加一个StudentBO,或者用另外一种不能识别jackson定义的@JsonProperty注解的库。
objectMapper.writeValue(System.out, model);这样行吗?
--- 共有 1 条评论 ---
额,不是这个意思 ,我这个其实是拉取别人资源-&转成自己model-&输出自己json,其中自己json字段是与原json字段名称有差异的,就是这么个过程,不是单独转化model变成json
反序列化时,也就是json ==& java bean的时候,这样创建Mapper,默认是开启注解的
ObjectMapper jackMapper = new ObjectMapper();
在序列化,也就是bean ==& jsonStr的时候,设置忽略注解即可
jackMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
public class JackjsonTest {
public static void main(String[] args) {
String jsonStr = "{\"firstName\":\"laowang\"}";
//默认开启注解模式,也就是下面UserBean中的@JsonProperty("firstName")是起效果的
ObjectMapper mapper = new ObjectMapper();
//成功的将json 转化为了 userBean
UserBean userBean = mapper.readValue(jsonStr, UserBean.class);
//忽略注解,使得原来业务中的字段不变,也就还是:{first_name:laowang},如果不设置,则返回{firstName:laowang}
mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
System.out.println(mapper.writeValueAsString(userBean));
} catch (IOException e) {
e.printStackTrace();
public class UserBean{
@JsonProperty("firstName")
private String first_
public String getFirst_name() {
return first_
public void setFirst_name(String first_name) {
this.first_name = first_
--- 共有 1 条评论 ---
哈哈,今天邮件收到了这么老问题的答复也是惊讶呀,?
这里有json数组的字断映射脚本 供参考&[android]解析 json 与 Gson 的嵌套数组
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
我是新到 Gson 解析,做了几个基本 Gson 解析。但这一次我 JSON 是复杂得多。我 JSON 看起来如下:
{"uname":"man101",
"uid":"2",
"account":{
"entry":[8,15.48],
"exit":[8,15.48],
"details":
[[0,0],[0,8.2],[1.15,8.2],[1.15,18.23],[7.33,18.23],[7.33,15.48],[12.15,2.28],
[12.35,2.28],[12.35,0],[10.65,0],[10.65,1.42],[8.1,1.42],[8.1,3.95],
[4.25,3.95],[4.25,0]],
"section":
"account":[[0,0],[0,3.35],
[4.25,3.35],[4.25,0]],
"category":"office",
"description":"Mobile based company",
"sectionname":"xyz",
"account":[[0,3.95],[0,7.8],
[4.25,7.8],4.25,3.95]],
"category":"office",
"description":"Network based company",
"sectionname":"ABC",
"category":"Cowork",
"description":"Combined office space"
我试着分析这下述方式
public class AccountData
public class Account
public float[]
public float[]
public List&float[]&
public List&Section&
public class Section
public List&float[]&
并尝试通过类似这样的结果
Gson gson = new Gson();
beaconList = gson.fromJson(result, AccountData.class);
它运行时没有任何错误,但当我试图访问某些数据时它给空值。
解决方法 1:
首先,你的 JSON 是错了,这里是更正后的版本 (注意,例如在您的代码第 9 行中多余的逗号)。
"uname": "man101",
"uid": "2",
"account": {
"entry": [
"details": [
"section": [
"account": [
"category": "office",
"description": "Mobile based company",
"sectionname": "xyz",
"account": [
"category": "office",
"description": "Network based company",
"sectionname": "ABC",
"category": "Cowork",
"description": "Combined office space"
您可以检查您 json 与或。
第二,Gson 不喜欢内部类那么多,除非它们声明为静态。
和第三个: 避免混合阵列和您的类中的泛型、 泛型是更安全使用,所以我重新定义您的类,如下所示:
public class AccountData {
public static class Account {
public List&Double&
public List&Double&
public List&List&Double&&
public List&Section&
public static class Section {
public List&List&Double&&
如果你不喜欢静态的内部类,您可以始终把 Section 和 Account 入单独的文件 (如果没有静态关键字的课程)。
正如布赖恩 · 罗奇在评论中指出,它不需要再为内部类是静态工作好与 Gson 的。所以第 2 点是再也没有真正的您可以删除静态从您的类声明。Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
作者:CM&时间:&分类:&评论:&浏览:804
在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。
Gson解析json的方法我这里就不详细说明了,网上一大把的例子,我这里主要说一下使用@SerializedName进行注解的情况。
使用Gson解析json成对象时默认的是将json里对应字段的值解析到java对象里对应字段的属性里面。然后我们经常会遇到我们自己定义的java对象里的属性名跟json里的字段名是不一样的,这种情况怎么办呢,这时我们就可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。
下面说说具体使用方法:
我们有一段json数据如下:
"n":"zhangsan"
"p":"123456"
这是一个user的数据包括id、用户名、密码、性别,如果正常些一个user类来解析的话是这样的:
public class
private String
private String
private String
private String
User类要这样写才能直接使用Gson直接解析出来,但是这样的话User类的属性命名就不太友好了,那我们要怎么做呢?Gson提供注解的方法来解决这个问题@SerializedName,使用方法如下:
public class
private String
@SerializedName("n")
private String
@SerializedName("p")
private String
@SerializedName("s")
private String
这样再使用Gson解析的时候就会将n对应的值赋值到userName属性上,同样的如果我们要将User生成json字符串使用Gson生成的时候也会将userName的名字生成n。这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 gson将对象转换成json 的文章

 

随机推荐