导航:首页 > 编程语言 > fastjson格式化json字符串

fastjson格式化json字符串

发布时间:2023-07-08 18:43:41

『壹』 当 json 遇到 Map

了解一下日常开发中关于 Json 解析的一些非常规用法,以及使用 fastjson 的一些总结。

一般情况 Json 的使用都是非常简单的。 我们会根据上游定义的 Json 数据格式,由下游定义相应的解析模型。比如像下面这个简单的 Json 字符串。

一般会定义如下的数据类(以 Kotlin 为例)

具体使用也是非常简单了,无论是借助 fastjson 、gson 或者是原生的 JsonObject 都可以非常方便的完成数据的序列化和反序列操作,比如以 fastjson 为例。

无论原始的 Json 数据格式多么的复杂,包含原始数据类型、List、数组还是他类型, 只要需要解析的属性的 key 是确定的,那么就可以定义出相应的数据模型来解析 。 因为在定义任何一个数据模型是时,对于其中的每一个字段(或者叫做属性、类成员),唯一需要确定的就是变量的类型和变量名的名称,比如面对下面这个略显复杂的 Json :

我们依旧可以定义出如下的数据模型

但有时候我们会遇到 Json 数据中,key 值无法确定的情况。也就是说,我们需要解析的字段名是不确定的。或者说,Json 数据中字段名和字段值重合的情况。

比如上面这个 Json ,按照日期返回一个 List(至于 List 里具体是什么,我们也无需关心)或者是其他任何数据,这里就比较有意思了。

既然返回的属性名是无法确定的,那么怎么定义 Json 对应的数据类型中的变量名呢 ?

上面 ??? 这里应该怎么定义呢? 毕竟总不能穷举所有日期吧? 再说也穷举不过来呀,时间是无限的呀。

这里就需要转换一下思路了,我们从本质出发,这里整个 Json 其实是一个 Map 。既然是一个 Map ,那我们就把他当做一个 Map 去解析好了。

因此,fastjson 在解析的时候不知道具体该怎么办了,只知道这是个把原始 Json 字符串解析为一个 Map 。剩下的就该靠我们自己了. fastjson 不知道具体类型,我们自己是知道的呀。因此,就需要遍历 map 自己去处理了。

到这里,我们就可以获取到原始 Json 字符串中的数据了。可以看到,对于上游返回的 Map 这种类型的数据,由于其本身灵活的特性,我们需要按具体的类型做具体拆解,没有通用的方法。

作为常用的 Json 序列化框架 ,这里总结一下使用 fastjson 遇到一些坑和收获。

日常开发中上游给我们的 Json 数据往往是很丰富的,并且由于 json 的特性,在一大段字符串中要找到我们关系的字段是有点困难的,因此我们往往把 Json 字符串贴到各类 Json解析助手之类的网站工具里,进行格式化。其实,不用那么麻烦,fastjson 自身提供了可以格式化打印 Json 的方法。

这里格式化打印一下刚才的 map printBeautyJson(map)

从截图可以看到,已经实现了 Json 的格式化输出。SerializerFeature 还有很多其他很多实用的功能,可以按需要进行配置。

JSONField 是一个定义在 fastjson 内的注解,其中最常用的两个值是 serialize 和 deserialize ,都是 boolean 类型,用户决定对特定字段进行序列化和反序列化。

序列化毕竟是一个 IO 操作,在优化性能的场景,我们就可以基于实际业务场景和需求出发,减少非必要的序列和反序列操作,尤其是对一些比较打的对象。需要注意的是,deserialize 这个值只有把注解打在方法上时才是有效的(这点可以从其源码看到)。

最后再说一个使用 fastjson 最最常见的问题,关于默认构造函数的问题。

我们知道一个普通的 java 类,如果没有定义构造函数的话,编译器会帮我们自定生成一个构造函数。但是如果我们自己定义了构造函数,那么默认的构造函数就没了。

这个时候如果我们直接解析 Json 解析,会抛出异常。 com.alibaba.fastjson.JSONException: default constructor not found
至于具体原因,看一下源码也很容易理解了。这个时候,就只能把默认的构造加上了。

而在使用 Kotlin 的场景,也是存在同样的问题。

现在大家都习惯使用 data class 定义数据类。虽然这样定义的类型,从反编译的结果看似乎是存在默认构造函数的,但依旧会报错。

可以看到是有存在构造函数的,但是依旧会产生问题。对于 Kotlin 的场景,我们用两种解决办法。

这样依旧不解决问题。

to be continued ...

本文从 Json 解析常规用法出发,解读了对 Map 这种 Json 数据类型的解析。从中可以学习到,有时候我们在面临一些问题是会一筹莫展,会出现非常规的场景。这个时候,就需要我们从问题的本质出发,看透问题的根源,一层层抽丝剥缕的去解决。

问题总是会不断出现的,重要的是在我们解决完问题之后不仅要学会解决方法,更要学会解决问题的思路。

『贰』 如何构建json串,并将map转为jsonObject对象的三种方式(scala)

众所周知,kafka中存储的数据是经过BASE64加密后的jsonObject,因此从kafka中读取的数据经过base64解码,得到的是json串,利用JSONObect的方法可以对json串进行解析,拿到对应的数据。那么要如何将scala对象或者java对象转换为JsonObject对象或JSONObject对象呢?(注意:JsonObject对象和JSONObject对象不同,调用的API也不一样)

三种转换方式依赖的包源码都是用JAVA编写,所以构建Map对象时完全使用java对象,不会发生错误。构建过程如下:

三种将java对象转换为jsonObject对象的开源包有:

1、google提供的Genson是一个完全的Java和JSON转换的类库,提供了全面的数据绑定、流操作等。基于Apache 2.0协议发布。转换结果为

JsonObject对象。

使用需要先导入Jar包:import com.google.gson.{Gson, JsonParser}

引入依赖:这里选用版本为:2.2.4,具体版本可以根据业务需求选择。

<dependency>

<groupId>com.google.code.gson</groupId>

<artifactId>gson</artifactId>

<version>2.2.4</version>

</dependency>

2、Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

导入jar包:import com.alibaba.fastjson.JSON

引入依赖:

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.8</version>

</dependency>

3、net.sf.json-lib方式

导入jar包:import net.sf.json.JSONObject

引入依赖:

<dependency>

<groupId>net.sf.json-lib</groupId>

<artifactId>json-lib-ext-spring</artifactId>

<version>1.0.2</version>

</dependency>

『叁』 fastjson怎样json转换成字符串

// jackson
private static ObjectMapper om = new ObjectMapper ();
public static String objectToString (Object obj ) throws IOException{
return om.writeValueAsString (obj );
}

@Test
public void test1 () throws IOException {
Map<String, Object> map = new HashMap<String, Object>();

Map<String, String> map2 = new HashMap<String, String>();
map2.put ("name", "1");
map2.put ("age", "12");
map.put ("att", map2 );

List<String> list = new ArrayList<String>();
list.add ("hi");list.add ("hello");
map.put ("list", list );

List<Map<String, String>> confuselist = new ArrayList<Map<String, String>>();
Map<String, String> map3 = new HashMap<String, String>();
map3.put ("name", "1");
map3.put ("age", "12");
confuselist.add (map3 );
confuselist.add (map2 );
map.put ("confuselist", confuselist );

Object array = Array.newInstance (String.class, 10 );
Array.set (array, 0, "a");
Array.set (array, 1, "b");
Array.set (array, 2, "c");
map.put ("array", array );
// 使用 jackson
System.out.println (objectToString (map ));
// 使用 fastJson
System.out.println (JSON.toJSONString (map ));
}

输出:
{"att":{"age":"12","name":"1"},"list":["hi","hello"],"confuselist":[{"age":"12","name":"1"}, {"age":"12","name":"1"}],"array":["a","b","c",null,null,null,null,null,null,null]}

{"att":{"age":"12","name":"1"},"list":["hi","hello"],"confuselist":[{"age":"12","name":"1"},{"$ref":"$.att"}],"array":["a","b","c",null,null,null,null,null,null,null]}

『肆』 fastjson中怎么把java对象转化为json对象

写入以下代码即可实现:

  1. public static void main(String[] args) {

  2. User_DAL userDal = new User_DAL();// 创建数据访问对象

  3. ResponseResult<User> ret = userDal.getUserList("id < 50", 2, 10);// 查询ID小于50的用户,保存版到分页类中

  4. String json = JSON.toJSONString(ret, true); // 将对象转换成json字符权串,true为格式化输出

  5. System.out.println(json);

  6. List<User> list = JSON.parseArray("{{name:123},{name:456}}", User.class);//将json字符串,转换成Java对象数组

  7. for (int i = 0; i < list.size(); i++) {

  8. System.out.println(list.get(i).getName());

  9. }

  10. }

『伍』 FastJson和Json以及@ResponseBody

@Restcontroller是@Controller和@ResponseBody的结合体,将后台返回的Java对象转换为Json字符串传递给前台。它是springmvc通过配置实现的,spring默认带的转json包为jackson,因为fastJson比较快一般会引入fastjson来替换。

解决bean与json字段不一致问题,或者字段定义不符合前端所需岩租要的标准,需要使用@JsonProperty和@JSONField注解粗橡兆。
@jsonProperty是Jackson的包,@JSONproperty这个注解用于属性上面
而@jsonfield是如链fastjson的包,@JSONField这个注解可以用于get、set以及属性上面@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")是时间的格式化,可以用于get、set以及属性上面

FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。FastJson的API十分简洁,FastJson重要的类为JSONObject,经常调用的方法如下:
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。

Jackson相对来说比较高效的Json类库,在项目中主要使用Jackson进行JSON和Java对象转换,Jackson ObjectMapper类是使用Jackson解析JSON最简单的方法。可以从字符串、流或文件解析JSON,并创建Java对象或对象图来表示已解析的JSON。将JSON解析为Java对象也称为从JSON反序列化Java对象
1.JAVA对象转JSON
ObjectMapper mapper = new ObjectMapper();
String bjectMapper = mapper.writeValueAsString(obj);
2.JSON转Java类[JSON反序列化]
ObjectMapper mapper = new ObjectMapper();
HashMap<String, Object> inMap = mapper.readValue(jsonStr, HashMap.class);

『陆』 fastjson是怎么实现JSON的序列化和反序列化的

反序列化源函数
· parseObject
-将 json字符串 反序列化为 java.class
@sherineZJU
List<T> temp= JSON.parseObject(fastjson,T.class);
//transform the json to T123123

-fastjson 为 json格式的字符串(String类型)
-T 为 与 json格式对应的 自定义 java.class。
· parseObject
-将 json字符串 反序列化为 java.util.List
@sherineZJU
List<T> oldk = JSONArray.parseArray(fastjson,T.class);
//transform the json to List<T>123123

-fastjson 为 json格式的字符串(String类型)
-List< T> 为 与 json格式对应的 自定义 java.util.List。
java.class 与 json字符串 的对应关系
注意 json字符串 的关键字一定要与 java.class 中的对应变量名相同。

阅读全文

与fastjson格式化json字符串相关的资料

热点内容
逍遥安卓微信验证 浏览:579
5g网络什么时候普及河北邢台 浏览:709
编程和运营哪个更适合创业 浏览:893
尤里x怎么升级 浏览:399
做业务绩效考核需要哪些数据 浏览:433
dnf85版本剑魔刷图加点 浏览:407
手机硬盘测试架可以读取哪些数据 浏览:704
ug前后处理结算结果找不到文件 浏览:769
网页框架拆分代码 浏览:382
未来十年网络安全有什么影响 浏览:362
win10更新后进不了剑灵 浏览:243
iphone471激活出错 浏览:648
怎么把文件拷到u盘 浏览:620
中伊签署文件视频 浏览:661
电信光宽带网络不稳定 浏览:504
网络岗软路由 浏览:995
黑莓z10在哪里下载app 浏览:310
net批量下载文件 浏览:696
怎么把苹果一体机文件拷贝 浏览:117
sql文件怎么写 浏览:9

友情链接