最近要给自己编写的服务器加上json解析模块。根据我当前的项目,可以预测服务器中使用json的地方:

  • 通信。由于与客户端通信使用google protocolbuffer,仅在与SDK通信中使用json
  • 配置。我们当前直接将配置转换为lua table。但其他项目依然有很大概率要使用json作为配置。
  • MongoDB。项目中使用MongoDB作为数据存储,很多接口需要用到json.

而在我的服务器中,写了一个MongoDB lua driver,可以直接将lua table转换为MongoDB的bson数据结构,DB这块不需要json了。像配置都是静态数据,一次加载后不会再加载了。而SDK通信也仅限于登录充值,相对来说对json的效率要求不是很高。

  由于服务器底层以C++为主,上层为lua,当然是先查找lua的json模块。在http://lua-users.org/wiki/JsonModules上,列出了主流的lua json模块。但是常用的也就lua4json和mp-cjson两个。lua4json是我们现在使用的,每一个玩家存库,都要将lua table转为json再传给MongoDB接口。从目前来看,性能还是可以的,而且是纯lua。mp-cjson貌似是cocos2dx标配的json解析模块,底层是基于cjson的,效率高,用的人也多。

  对于lua而言,传统的数组和关联数据都是lua table,要转为json时就要做一些判断才能知道是array还是object。我希望是这样的:

  • 如果key都是int,则是数组。而如果key不是从1开始,则是稀疏数组(sparse array)。
  • 允许通过元表指定是array还是object。如果指定为object,则所有key会被转换为string。如果指定为array而key中包含float、string则使用自增的int做key。

  lua4json是不能指定是array还是object的,并且尝试将key为float等也转换为array。因此一个空的lua table( {} )只能由lua4json的作者定死为array。这对于从lua写进数据库,从lua读出来也不是太大的问题。但在实际使用中发现,如果你尝试在Mongo Shell中做些操作或者用java写的后台读取数据时,就有点麻烦了。不过json4lua是纯lua的,我改改就可以用了。在最后进行测试时,解析从https://github.com/miloyip/nativejson-benchmark中下载的一个2M多的json串,花了7分多钟。结果,我放弃了,万一哪天策划给我来个8M的配置表,我开个服务器岂不得用半个钟。

  mp-cjson我看了一下api(http://www.kyne.com.au/~mark/software/lua-cjson-manual.html),有一个encode_sparse_array函数可以处理sparse array,但也没有可以强制指定array、object的函数。

  在泛型语言与强类型语言交互的时候,确定类型很重要。比如我有这样一个lua table:

local reply =
{
array_item = {},
map_id = {}
}

现在我要将他转换为json存到MongoDB或者发送到java后台,json串应该是

{ "array_item":[],"map_id":{} }

上面的两个库,没有一个做得到。于是我决定自己写一个lua的json模块。

  自己再写基础的json解析是不太可能的了。我决定使用小巧的parson,然后给他加上lua的粘合层,就可以成为lua的模块了,命名为lua_parson。我定了比较详细的规则:

  • 如果key值都为int并且小于INT_MAX,必定为数组。
  • 如果在元表指定__array并且值为true,则必定为数组
  • 如果是数组并且key都为int,则为sparse array,空位直接使用null填充
  • 如果1、2两点不成立,则必为object。object中所有不为string的key都将直接转换为string

  现在这个库放在https://github.com/changnet/lua_parson。安装使用也比较简单。注意这个库不是线程安全的。

  我自己以前也觉得不要重复造轮子,但现在觉得别人的轮子并不是那么好用。虽然实际情况项目中,上面列出的极端情况还没出现过,那些库也可以将就者用。即使出现了,也可以换种方法解决。但如果可以完美一点,为什么不去做呢?

我为什么要再给lua写一个json模块的更多相关文章

  1. java 写一个JSON解析的工具类

    上面是一个标准的json的响应内容截图,第一个红圈”per_page”是一个json对象,我们可以根据”per_page”来找到对应值是3,而第二个红圈“data”是一个JSON数组,而不是对象,不能 ...

  2. 一起写一个JSON解析器

    [本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限 ...

  3. 有强迫症的我只能自己写一个json格式化工具

    缘由 为什么博客园的markdown解析出问题了啊?好奇怪啊! 一直以来在编码规范界有2大争论不休的话题,一个是关于是用空格缩进还是tab缩进的问题,一个是花括号是否换行的问题,笔者是tab缩进和花括 ...

  4. 手写一个json格式化 api

    最近写的一个东西需要对json字符串进行格式化然后显示在网页上面. 我就想去网上找找有没有这样的api可以直接调用.百度 json api ,搜索结果都是那种只能在网页上进行校验的工具,没有api. ...

  5. 再用python写一个文本处理的东东

    朋友遇到一点麻烦,我自告奋勇帮忙.事情是这样的: - 他们的业务系统中,数据来自一个邮箱: - 每一个邮件包含一条记录: - 这些记录是纯文本的,字段之间由一些特殊字符分隔: - 他们需要从邮箱中批量 ...

  6. 关于generator异步编程的理解以及如何动手写一个co模块

    generator出现之前,想要实现对异步队列中任务的流程控制,大概有这么一下几种方式: 回调函数 事件监听 发布/订阅 promise对象 第一种方式想必大家是最常见的,其代码组织方式如下: fun ...

  7. 用c#写一个json的万能解析器

    CommonJsonModel .cs /// <summary> /// 万能JSON解析器 /// </summary> public class CommonJsonMo ...

  8. 如何在 React Native 中写一个自定义模块

    https://my.oschina.net/jpushtech/blog/983230

  9. 以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewC ...

随机推荐

  1. 无限循环的ViewPager

    目前情况 在不修改源码的情况下,当ViewPager滑动到最后一个item的时候,他就无法再往右滑动:当ViewPager滑动到第一个item的时候,他也无法再往前滑动.(以上全是废话) 设想 我们可 ...

  2. noip 2005 等价表达式

    /* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串 ...

  3. 本机运行.net 2.0项目报错,解决方案

    本机在iis上运行.net 2.0项目时,报以下错误“请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理”: 本机环境配置: 安装有以下几个.net 版本:v1.0.3705,v1.1.4322 ...

  4. ManagedPipelineHandler IIS

    IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandl ...

  5. MSSQL 查询统计某状态出现的次数及累计时间

    1.问题来源 最近客户需要统计某个设备,某状态,在某一个时间段内出现的次数,并计算累计出现的时间. 数据源如下: 现在如果要统计UPSCTSTA状态为D出现的次数(同一状态,连续出现的认为是一次),并 ...

  6. c 单链表反转(不添加新结点空间)

    最近复习考研,加上一直都将"算法"放在很高的位置,所以,蛮重视算法的.不多说了,其实这个问题,不难理解的. 主要代码: //反转单链表. void reverse(linklist ...

  7. deep learning in nlp 资料文献

    Deep Learning for Natural Language Processing (without Magic) http://nlp.stanford.edu/courses/NAACL2 ...

  8. iOS用心学 UI基础之UIView

    一.引入UI 在实际开发中,基本的流程大致如下图所示: UI(User Interface)作为最基本的要点,也是非常重要的一部分,UI界面的美观直接决定着着用户的体验,苹果官方给开发中提供了非常强大 ...

  9. POP动画引擎中Layer与CALayer的一点区别

    POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...

  10. DWZ简介及其使用

    来源:http://blog.csdn.net/t123012009065/article/details/8286826 DWZ简介:   DWZ富客户端框架(jQuery RIA framewor ...