后端系统开发之JSON技巧

最近在做系统模块重构时遇到一个小问题:如何将一个带格式的JSON字符串转换成不带格式的、“拉平”的JSON字符串?在解决这个小问题时花费了不少时间,请教了好几个同事。因此感觉很有必要写文纪念一下,让后人少走一些弯路,同时也对JSON使用经验做个总结。

学习任何技术本质上都是在学习它的历史,JSON是如何产生的,最初用于解决什么问题?

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,它采用完全独立于编程语言的文本格式来存储和表示数据。JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式(以上内容整理自百度百科)。

通过工程实践,我总结了一些JSON的使用技巧和经验,分享给大家:

1、注意JSON接口风格的统一。例如变量名称风格一致,都使用小写的类似"name":"value"格式,中英文尽量不混合使用。还有一种统一是指数字和字符串类型保持统一,例如"num":10和"num":"10"都是正确的JSON风格,前者的值是数字,而后者是字符串,整体风格最好保持统一(写到这里的时候,情不自禁想到了自己之前一些糟糕的JSON接口设计,真是往事不堪回首啊)。

2、JSON和protobuf相互转化使用开源软件json2pb,而不要自己造轮子。json2pb真的非常好用,用它能快速做出很多实用的工具,例如利用JSON串生成模拟数据(JSON转换为pb)、解析pb文件(pb转换为JSON)等。

有的开源软件中就直接使用它,例如brpc框架中就集成了json2pb(注:brpc是百度的一款非常先进的开源RPC框架,用了类似协程的技术bthread解决高并发问题,口碑和实际效果都非常好)。

3、JSON和string的相互转换技巧。通常JSON开源软件中都会提供JSON和字符串的互换方法,这里以我遇到的Jsoncpp为例,将一个JSON字符串转换为Json::Value比较简单,直接使用Json::Value的构造函数就可以了。

我们可以调用toStyledString获取带漂亮格式的JSON字符串,示意代码如下:

Json::Value json_value;
json_value["player"]["number"] = 7;
json_value["player"]["name"] = "WuLei";
std::string str_json = Json_value.toStyledString();
std::cout << str_json << std::endl;

如果想要去掉toStyledString函数的空格、TAB、换号等格式,可以使用Jsoncpp的FastWriter类,调用write方法,代码如下:

Json::FastWriter fast_writer;
std::string str_player = fast_writer.write(Json_value);
std::cout << str_palyer << std::endl;

这就是文章开始所说的不带格式的、“拉平”的JSON字符串获取方法。

最后说下JSON和pb的简单区别,protobuf也常用来设计成上下游服务交互的接口,而JSON的可读性要明显好于protobuf,因此JSON常用作内部服务和外部服务之间的接口,因为它更容易被理解;而protobuf多用作内部服务之间,因为protocol buffer其实提供的是一整套的RPC框架,远不止作为服务接口这么简单。


金句分享

犯错是好事,前提是我们能在每一次失败中吸取教训。

——《富爸爸穷爸爸》,作者是美国的罗伯特清崎。

解读:“富爸爸”是一本相见恨晚的好书,作者在书中告诉人们这样的事实:财商和智商真的是两码事!

猜你喜欢

转载自blog.csdn.net/wanfang323/article/details/87740310