Json介绍及Jsoncpp简单使用(测试代码+测试实例)

Json介绍及Jsoncpp简单使用

Json介绍
JSON是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

Json介绍及Jsoncpp简单使用(测试代码+测试实例)_第1张图片

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
Json介绍及Jsoncpp简单使用(测试代码+测试实例)_第2张图片

值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

Json介绍及Jsoncpp简单使用(测试代码+测试实例)_第3张图片

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

Json介绍及Jsoncpp简单使用(测试代码+测试实例)_第4张图片

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

Json介绍及Jsoncpp简单使用(测试代码+测试实例)_第5张图片

空白可以加入到任何符号之间。下面为一个Json数据

{
    "object1": {
        "number": 3,
        "string": "This is string",
        "double": 1.001,
        "array": [
            {
                "number": -111,
                "string": "first string"
            },
            {
                "number": 2,
                "string": "这是一个字符串"
            }
        ]
    },
    "object2": {
        "number1": 30,
        "number2": 70
    },
    "number" : 10
}

此数据有如下特点:

  • 此结构任意一个节点为可以key:value对,此处的value可能为string、number、array、object;
  • 此结构有较好的可读性,易维护;
  • 此结构可作为BS架构之间的交互数据格式;
  • 此结构易拓展,不改变原有结构基础上,任意添加字段,一般不会引起兼容性问题;

Json值与C++值之间的转换
C++的值转换为Json值时,调用了Json的各种构造函数和拷贝构造函数;而Json值转换为C++值时,需要调用专门的接口函数。

  • 使用C++中的std::string,const char*类型的值可以和Json的string值相互转换;
  • C++的bool或float等标量类型值可以和Json的number或bool值相互转换,只有一个条件就是转换时不能降低精度或丢失数据;
  • 同时可以将一个null类型的Json值转换成所有支持的C++类型(转为std::string类型时,返回的内容为”“;转换成const char*类型时,返回的是空指针;转换为标量类型时,返回的值是0;转换成布尔类型时,返回的值是false);
  • Json中的object类型和array类型是不能转换为C++值的;
  • array类型可以通过数组下标形式访问每一个独立的value值,在根据上述原则迭代转换
  • object类型可以通过详细的key值访问

Jsoncpp使用

jsoncpp开源下载地址:https://github.com/open-source-parsers/jsoncpp
可去上述路径下载最新的代码,由于本人之前一直使用的Jsoncpp为较老代码,相对够用,就没有使用最新代码。下面两个路径中均包括可以使用的makefile文件,如下平台编译测试:VirtualBox+ubuntu 15.10
Jsoncpp代码路径:http://download.csdn.net/detail/be_fb/9521102
测试Jsoncpp代码路径(依赖上述路径):http://download.csdn.net/detail/be_fb/9521104

ps:后续补上Jsoncpp源码分析。

你可能感兴趣的:(工具类资料)