文档章节

d语言json的解析

轻舞凋零
 轻舞凋零
发布于 2016/01/26 13:19
字数 477
阅读 67
收藏 0

参考自d程序设计语言---我的博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow me

json库的使用

import std.stdio;
import std.json;


void main() {
	//convert json string to json-value
	string s = "{\"name\":\"tom\",\"age\":12,\"grade\":\"[21,32,56,90]\"}";
	JSONValue strToJV = parseJSON(s);
	writeln(strToJV["name"].str(),strToJV["age"].integer());
	
	//convert json-value to json string
	// JSONValue[string]               object;实际上对应一个JSONValue[string] 的关联数组
 	JSONValue  JVToStr = ["name":"tom"];
	JVToStr.object["age"] = JSONValue(12);
	JVToStr.object["grade"] = JSONValue([21,32,56]);
	JVToStr.object["grade"].array ~= JSONValue(90);
	writeln(JVToStr.toString);
	
}

D语言用JSONValue结构存储json数据

JSONValue通过union Store 存储数据,type_tag存储数据类型

union Store
    {
        string                          str;
        long                            integer;
        ulong                           uinteger;
        double                          floating;
        JSONValue[string]               object;
        JSONValue[]                     array;
    }
    private Store store;
    private JSON_TYPE type_tag;

一堆的值判断。

JSONValue通过tostring方法调用toJSON方法调用

这个函数通过toValue去做判断和处理

string toJSON(in JSONValue* root, in bool pretty = false, in JSONOptions options = JSONOptions.none)
{
    auto json = appender!string();

    void toString(string str)
    {
        json.put('"');

        foreach (dchar c; str)
        {
            switch(c)
            {
                case '"':       json.put("\\\"");       break;
                case '\\':      json.put("\\\\");       break;
                case '/':       json.put("\\/");        break;
                case '\b':      json.put("\\b");        break;
                case '\f':      json.put("\\f");        break;
                case '\n':      json.put("\\n");        break;
                case '\r':      json.put("\\r");        break;
                case '\t':      json.put("\\t");        break;
                default:
                    appendJSONChar(&json, c,
                                   (msg) { throw new JSONException(msg); });
            }
        }

        json.put('"');
    }

    void toValue(in JSONValue* value, ulong indentLevel)
    {
        void putTabs(ulong additionalIndent = 0)
        {
            if(pretty)
                foreach(i; 0 .. indentLevel + additionalIndent)
                    json.put("    ");
        }
        void putEOL()
        {
            if(pretty)
                json.put('\n');
        }
        void putCharAndEOL(char ch)
        {
            json.put(ch);
            putEOL();
        }

        final switch(value.type)
        {
            case JSON_TYPE.OBJECT:
                if(!value.store.object.length)
                {
                    json.put("{}");
                }
                else
                {
                    putCharAndEOL('{');
                    bool first = true;

                    void emit(R)(R names)
                    {
                        foreach (name; names)
                        {
                            auto member = value.store.object[name];
                            if(!first)
                                putCharAndEOL(',');
                            first = false;
                            putTabs(1);
                            toString(name);
                            json.put(':');
                            if(pretty)
                                json.put(' ');
                            toValue(&member, indentLevel + 1);
                        }
                    }

                    import std.algorithm : sort;
                    auto names = value.store.object.keys;
                    sort(names);
                    emit(names);

                    putEOL();
                    putTabs();
                    json.put('}');
                }
                break;

            case JSON_TYPE.ARRAY:
                if(value.store.array.empty)
                {
                    json.put("[]");
                }
                else
                {
                    putCharAndEOL('[');
                    foreach (i, ref el; value.store.array)
                    {
                        if(i)
                            putCharAndEOL(',');
                        putTabs(1);
                        toValue(&el, indentLevel + 1);
                    }
                    putEOL();
                    putTabs();
                    json.put(']');
                }
                break;

            case JSON_TYPE.STRING:
                toString(value.store.str);
                break;

            case JSON_TYPE.INTEGER:
                json.put(to!string(value.store.integer));
                break;

            case JSON_TYPE.UINTEGER:
                json.put(to!string(value.store.uinteger));
                break;

            case JSON_TYPE.FLOAT:
                import std.math : isNaN, isInfinity;

                auto val = value.store.floating;

                if (val.isNaN) {
                    if (options & JSONOptions.specialFloatLiterals) {
                        toString(JSONFloatLiteral.nan);
                    }
                    else {
                        throw new JSONException(
                            "Cannot encode NaN. Consider passing the specialFloatLiterals flag.");
                    }
                }
                else if (val.isInfinity) {
                    if (options & JSONOptions.specialFloatLiterals) {
                        toString((val > 0) ?  JSONFloatLiteral.inf : JSONFloatLiteral.negativeInf);
                    }
                    else {
                        throw new JSONException(
                            "Cannot encode Infinity. Consider passing the specialFloatLiterals flag.");
                    }
                }
                else {
                    json.put(to!string(val));
                }
                break;

            case JSON_TYPE.TRUE:
                json.put("true");
                break;

            case JSON_TYPE.FALSE:
                json.put("false");
                break;

            case JSON_TYPE.NULL:
                json.put("null");
                break;
        }
    }

    toValue(root, 0);
    return json.data;
}






© 著作权归作者所有

共有 人打赏支持
轻舞凋零
粉丝 13
博文 100
码字总数 16794
作品 0
昌平
程序员
10月编程语言排行榜:不成大器的D语言

【51CTO独家特稿】今天Tiobe发布了2011年10月编程语言排行榜,本期排行榜我们看到Lua这门语言蹿升很快,而传统的竞争对手C#和PHP正在交替自己的位置。Assembly(汇编语言)正在大踏步的向后退...

zjf_sdnu
2011/10/17
0
0
系统级编程语言性能大PK的笑话-Go语言

喜欢和不喜欢Go语言的都喜欢拿性能PK说事. 流传比较广的是benchmarksgame的PK数据: http://benchmarksgame.alioth.debian.org/u64q/go.php 在 benchmarksgame测试中, Go语言的性能已经由之前...

chai2010
2013/08/06
0
7
Dlang 2.080.0 版本发布,系统级编程语言

近期D语言在版本发布迭代速度上有明显提升,此次D语言 2.080.0 版本更新特性如下: 增强编译时特性可用性 提供更好的 Objective-C 兼容 废弃一些早期版本不推荐使用的类和方法 对标准库的多方...

冰力
05/13
0
0
LDC 1.9.0 发布,基于 LLVM 架构的 D 语言编译器

Kinke 代表LDC团队,很高兴地宣布LDC 1.9,这个版本的重点是: 编译器兼容 dlang 2.079.1 (引入了新的 -i 参数来支持最小D语言运行时); 支持 llvm 6,用于所有预构建包(Win32除外); 可...

冰力
05/13
0
3
Linux C++ 环境搭建 IDE选择 Code::Blocks

在linux下面IDE还是挺多的。 本来打算用elcipse的,但是发现了一个更好更快的C++IDE http://www.codeblocks.org/ Code::Blocks 是一个C++免费的跨平台IDE。 1,下载安装 下载地址: http...

freewebsys
2012/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
23分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
30分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
33分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
38分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部