前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JSONObject中Java对象转换成Json格式的两种方式

JSONObject中Java对象转换成Json格式的两种方式

作者头像
全栈程序员站长
发布2022-09-05 14:24:23
2.3K0
发布2022-09-05 14:24:23
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1、alibaba的JSONObject对象调用toJSONString方法直接转换

pom.xml 依赖:

代码语言:javascript
复制
<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.41</version>
</dependency>

代码:

代码语言:javascript
复制
RiemannUser riemannUser = new RiemannUser();
riemannUser.setId(1);
riemannUser.setMessage("Hello JSONObject");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
riemannUser.setSendDate(date);

String jsonString = JSONObject.toJSONString(riemannUser);
System.out.println(jsonString);

运行结果:

代码语言:javascript
复制
{"id":1,"message":"Hello JSONObject","sendDate":"2019-07-04 00:01:55"}

alibaba的JSONObject.toJSONString 的源码

代码语言:javascript
复制
public static String toJSONString(Object object) { 
   
	return toJSONString(object, new SerializerFeature[0]);
}

public static String toJSONString(Object object, SerializerFeature... features) { 
   
    SerializeWriter out = new SerializeWriter();

    try { 
   
        JSONSerializer serializer = new JSONSerializer(out);
        for (com.alibaba.fastjson.serializer.SerializerFeature feature : features) { 
   
            serializer.config(feature, true);
        }

        serializer.write(object);

        return out.toString();
    } finally { 
   
        out.close();
    }
}

2、net.sf.json.JSONObject 先调用 fromObject 再调用 toString

pom.xml 依赖:

代码语言:javascript
复制
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

这里一定要加入<classifier>jdk15</classifier> 这一行,原因是:还关系到两个jdk版本的实现json-lib-2.1-jdk13.jar和json-lib-2.1-jdk15.jar。

代码:

代码语言:javascript
复制
RiemannUser riemannUser = new RiemannUser();
riemannUser.setId(1);
riemannUser.setMessage("Hello JSONObject");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
riemannUser.setSendDate(date);

JSONObject jsonObject = JSONObject.fromObject(riemannUser);
String jsonString = jsonObject.toString();
System.out.println(jsonString);

运行结果:

代码语言:javascript
复制
{"id":1,"intList":[],"message":"Hello JSONObject","nodeName":"","sendDate":"2019-07-03 23:59:32"}

3、总结

通过这两种方式,不知道小伙伴们有没有发现什么秘密。

是的,运行结果不一样,第一种方式是得到set了的值,为空的值不会取出来。

相反,第二种方式得到是这个对象的所有属性,不管有值还是没有值。

代码语言:javascript
复制
public static JSONObject fromObject(Object object) { 
   
    return fromObject(object, new JsonConfig());
}

public static JSONObject fromObject(Object object, JsonConfig jsonConfig) { 
   
    if (object != null && !JSONUtils.isNull(object)) { 
   
        if (object instanceof Enum) { 
   
            throw new JSONException("'object' is an Enum. Use JSONArray instead");
        } else if (object instanceof Annotation || object != null && object.getClass().isAnnotation()) { 
   
            throw new JSONException("'object' is an Annotation.");
        } else if (object instanceof JSONObject) { 
   
            return _fromJSONObject((JSONObject)object, jsonConfig);
        } else if (object instanceof DynaBean) { 
   
            return _fromDynaBean((DynaBean)object, jsonConfig);
        } else if (object instanceof JSONTokener) { 
   
            return _fromJSONTokener((JSONTokener)object, jsonConfig);
        } else if (object instanceof JSONString) { 
   
            return _fromJSONString((JSONString)object, jsonConfig);
        } else if (object instanceof Map) { 
   
            return _fromMap((Map)object, jsonConfig);
        } else if (object instanceof String) { 
   
            return _fromString((String)object, jsonConfig);
        } else if (!JSONUtils.isNumber(object) && !JSONUtils.isBoolean(object) && !JSONUtils.isString(object)) { 
   
            if (JSONUtils.isArray(object)) { 
   
                throw new JSONException("'object' is an array. Use JSONArray instead");
            } else { 
   
                return _fromBean(object, jsonConfig);
            }
        } else { 
   
            return new JSONObject();
        }
    } else { 
   
        return new JSONObject(true);
    }
}

private static JSONObject _fromString(String str, JsonConfig jsonConfig) { 
   
    if (str != null && !"null".equals(str)) { 
   
        return _fromJSONTokener(new JSONTokener(str), jsonConfig);
    } else { 
   
        fireObjectStartEvent(jsonConfig);
        fireObjectEndEvent(jsonConfig);
        return new JSONObject(true);
    }
}

public JSONObject(boolean isNull) { 
   
   this();
    this.nullObject = isNull;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从源码也可以看出,为空的字段,赋的空的值。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137601.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档