[聚合文章] 「MojoUnityJson」C#实现超级简单和高效的JSON解析器

.Net 1900-01-01 19 阅读

MojoUnityJson是使用C#实现的JSON解析器 ,算法思路来自于游戏引擎Mojoc的C语言实现Json.h。借助C#的类库,可以比C的实现更加的简单和全面,尤其是处理Unicode Code(\u开头)字符的解析,C#的StringBuilder本身就支持了UnicodeCodePoint。

MojoUnityJson使用递归下降的解析模式,核心解析代码只有450行(去掉空行可能只有300多行),支持标准的JSON格式。算法实现力求简洁明了,用最直接最快速的方法达到目的,没有复杂的概念和模式。除了解析JSON,还提供了一组方便直观的API来访问JSON数据,整体实现只有一个文件,仅依赖System.Collections.GenericSystem.TextSystem 三个命名空间,MojoUnityJson可以很容易的嵌入到其它项目里使用。

本文主要介绍一下,超级简单又高效,并且看一眼就完全明白的解析算法,几乎可以原封不动的复制粘贴成其它语言版本的实现。

保存上下文信息

使用一个简单的结构体,用来在解析的过程中,传递一些上下文数据。

private struct Data{    // 需要解析的JSON字符串    public string        json;    // 当前JSON字符串解析的位置索引    public int           index;    // 缓存一个StringBuilder,用来抠出JSON的一段字符。    public StringBuilder sb;    public Data(string json, int index)    {        this.json  = json;        this.index = index;        this.sb    = new StringBuilder();    }}

抽象JSON的值

我们把JSON的值抽象成以下几个类型:

 public enum JsonType {     Object,     Array,     String,     Number,     Bool,     Null, }

整体解析步骤

// 解析 JsonValueprivate static JsonValue ParseValue(ref Data data);// 解析 JsonObjectprivate static JsonValue ParseObject(ref Data data);// 解析 JsonArrayprivate static JsonValue ParseArray(ref Data data);// 解析 stringprivate static JsonValue ParseString(ref Data data);// 解析 numberprivate static JsonValue ParseNumber(ref Data data)

这就是全部的解析流程,在ParseValue中会根据字符判断类型,分别调用下面几个不同的解析函数。JsonValue就对应一个JSON的值,它有一个JsonType代表了这个值的类型。这是一个递归的过程,在ParseValue,ParseObject和ParseArray过程中,会递归的调用ParseValue。JSON一定是始于一个,Object或Array,当这个最顶层的值解析完毕的时候,整个JSON也就解析完成了。

解析空白字符

解析过程中,会有很多为了格式化存在的空白字符,需要剔除这些,才能获得有信息的字符,这是一个重复的过程,需要一个函数统一处理。

private static void SkipWhiteSpace(ref Data data){    while (true)    {        switch (data.json[data.index])        {            case ' ' :            case '\t':            case '\n':            case '\r':                data.index++; // 每次消耗一个字符,就向后推进JSON的索引                continue;
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。