互联网创意网站有哪些方面,创建网站的准备,长春网站开发培训价格,郑州易站通网站公司JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式#xff0c;这些特性使JSON成为理想的数据交换语言。易于人阅读和编写#xff0c;同时也易于机器解析和生成。 基础结构 JSON建构于两种结构#xff1a;1. “名称/值”对的集…JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式这些特性使JSON成为理想的数据交换语言。易于人阅读和编写同时也易于机器解析和生成。 基础结构 JSON建构于两种结构1. “名称/值”对的集合A collection of name/value pairs。不同的语言中它被理解为对象object记录record结构struct字典dictionary哈希表hash table有键列表keyed list或者关联数组 associative array。 2. 值的有序列表An ordered list of values。在大部分语言中它被理解为数组array。 基础示例 简单地说JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串然后就可以在函数之间轻松地传递这个字符串或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪但是 JavaScript 很容易解释它而且 JSON 可以表示比名称 / 值对更复杂的结构。例如可以表示数组和复杂的对象而不仅仅是键和值的简单列表。表示名称 / 值对按照最简单的形式可以用下面这样的 JSON 表示 名称 / 值对 { firstName: Brett }这个示例非常基本而且实际上比等效的纯文本 名称 / 值对 占用更多的空间firstNameBrett 但是当将多个名称 / 值对串在一起时JSON 就会体现出它的价值了。首先可以创建包含多个名称 / 值对的 记录比如 { firstName: Brett, lastName:McLaughlin, email: aaaa } 从语法方面来看这与名称 / 值对相比并没有很大的优势但是在这种情况下 JSON 更容易使用而且可读性更好。例如它明确地表示以上三个值都是同一记录的一部分花括号使这些值有了某种联系。 表示数组当需要表示一组值时JSON 不但能够提高可读性而且可以减少复杂性。例如假设您希望表示一个人名列表。在 XML 中需要许多开始标记和结束标记如果使用典型的 名称 / 值 对就像在本系列前面文章中看到的那种名称 / 值对那么必须建立一种专有的数据格式或者将键名称修改为 person1-firstName这样的形式。如果使用 JSON就只需将多个带花括号的记录分组在一起 { people: [ { firstName: Brett, lastName:McLaughlin, email: aaaa }, { firstName: Jason, lastName:Hunter, email: bbbb}, { firstName: Elliotte, lastName:Harold, email: cccc } ]} 这不难理解。在这个示例中只有一个名为 people的变量值是包含三个条目的数组每个条目是一个人的记录其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然可以使用相同的语法表示多个值每个值包含多个记录 { programmers: [ { firstName: Brett, lastName:McLaughlin, email: aaaa }, { firstName: Jason, lastName:Hunter, email: bbbb }, { firstName: Elliotte, lastName:Harold, email: cccc } ], authors: [ { firstName: Isaac, lastName: Asimov, genre: science fiction }, { firstName: Tad, lastName: Williams, genre: fantasy }, { firstName: Frank, lastName: Peretti, genre: christian fiction } ], musicians: [ { firstName: Eric, lastName: Clapton, instrument: guitar }, { firstName: Sergei, lastName: Rachmaninoff, instrument: piano } ] } 这里最值得注意的是能够表示多个值每个值进而包含多个值。但是还应该注意在不同的主条目programmers、authors 和 musicians之间记录中实际的名称 / 值对可以不一样。JSON 是完全动态的允许在 JSON 结构的中间改变表示数据的方式。 在处理 JSON 格式的数据时没有需要遵守的预定义的约束。所以在同样的数据结构中可以改变表示数据的方式甚至可以以不同方式表示同一事物。 格式应用 掌握了 JSON 格式之后在 JavaScript 中使用它就很简单了。JSON 是 JavaScript 原生格式这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。将 JSON 数据赋值给变量例如可以创建一个新的 JavaScript 变量然后将 JSON 格式的数据字符串直接赋值给它var people { programmers: [ { firstName: Brett, lastName:McLaughlin, email: aaaa }, { firstName: Jason, lastName:Hunter, email: bbbb }, { firstName: Elliotte, lastName:Harold, email: cccc } ], authors: [ { firstName: Isaac, lastName: Asimov, genre: science fiction }, { firstName: Tad, lastName: Williams, genre: fantasy }, { firstName: Frank, lastName: Peretti, genre: christian fiction } ], musicians: [ { firstName: Eric, lastName: Clapton, instrument: guitar }, { firstName: Sergei, lastName: Rachmaninoff, instrument: piano } ] } 这非常简单现在 people包含前面看到的 JSON 格式的数据。但是这还不够因为访问数据的方式似乎还不明显。 访问数据尽管看起来不明显但是上面的长字符串实际上只是一个数组将这个数组放进 JavaScript 变量之后就可以很轻松地访问它。实际上只需用点号表示法来表示数组元素。所以要想访问 programmers 列表的第一个条目的姓氏只需在 JavaScript 中使用下面这样的代码people.programmers[0].lastName; 注意数组索引是从零开始的。所以这行代码首先访问 people变量中的数据然后移动到称为 programmers的条目再移动到第一个记录[0]最后访问 lastName键的值。结果是字符串值 “McLaughlin”。 下面是使用同一变量的几个示例。 people.authors[1].genre // Value is fantasy people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isnt one people.programmers[2].firstName // Value is Elliotte 利用这样的语法可以处理任何 JSON 格式的数据而不需要使用任何额外的 JavaScript 工具包或 API。 修改 JSON 数据正如可以用点号和括号访问数据也可以按照同样的方式轻松地修改数据people.musicians[1].lastName Rachmaninov; 在将字符串转换为 JavaScript 对象之后就可以像这样修改变量中的数据。 转换回字符串当然如果不能轻松地将对象转换回本文提到的文本格式那么所有数据修改都没有太大的价值。在 JavaScript 中这种转换也很简单String newJSONtext people.toJSONString(); 这样就行了现在就获得了一个可以在任何地方使用的文本字符串例如可以将它用作 Ajax 应用程序中的请求字符串。 更重要的是可以将任何JavaScript 对象转换为 JSON 文本。并非只能处理原来用 JSON 字符串赋值的变量。为了对名为 myObject的对象进行转换只需执行相同形式的命令 String myObjectInJSON myObject.toJSONString(); 这就是 JSON 与本系列讨论的其他数据格式之间最大的差异。如果使用 JSON只需调用一个简单的函数就可以获得经过格式化的数据可以直接使用了。对于其他数据格式需要在原始数据和格式化数据之间进行转换。即使使用 Document Object Model 这样的 API提供了将自己的数据结构转换为文本的函数也需要学习这个 API 并使用 API 的对象而不是使用原生的 JavaScript 对象和语法。 最终结论是如果要处理大量 JavaScript 对象那么 JSON 几乎肯定是一个好选择这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。 概念比较 JSON和XML的比较 ◆可读性 JSON和XML的可读性可谓不相上下一边是简易的语法一边是规范的标签形式很难分出胜负。 ◆可扩展性 XML天生有很好的扩展性JSON当然也有没有什么是XML能扩展而JSON却不能。不过JSON在Javascript主场作战可以存储Javascript复合对象有着xml不可比拟的优势。 ◆编码难度 XML有丰富的编码工具比如Dom4j、JDom等JSON也有提供的工具。无工具的情况下相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串不过xml文档要多很多结构上的字符。 ◆解码难度 XML的解析方式有两种 一是通过文档模型解析也就是通过父标签索引出一组标记。例如xmlData.getElementsByTagName(tagName)但是这样是要在预先知道文档结构的情况下使用无法进行通用的封装。 另外一种方法是遍历节点document 以及 childNodes。这个可以通过递归来实现不过解析出来的数据仍旧是形式各异往往也不能满足预先的要求。 凡是这样可扩展的结构数据解析起来一定都很困难。 JSON也同样如此。如果预先知道JSON结构的情况下使用JSON进行数据传递简直是太美妙了可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员一定会非常喜欢JSON。但是如果你是一个应用开发人员就不是那么喜欢了毕竟xml才是真正的结构化标记语言用于进行数据传递。 而如果不知道JSON的结构而去解析JSON的话那简直是噩梦。费时费力不说代码也会变得冗余拖沓得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串这样仍旧是噩梦。常用JSON的人看到这个字符串之后就对JSON的结构很明了了就更容易的操作JSON。 以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内JSON毕竟是主场作战其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象而且不知道其结构的话我相信很多程序员也一样是哭着解析JSON的。 ◆实例比较 XML和JSON都使用结构化方法来标记数据下面来做一个简单的比较。 用XML表示中国部分省市数据如下 ?xml version1.0 encodingutf-8? country name中国/name province name黑龙江/name cities city哈尔滨/city city大庆/city /cities /province province name广东/name cities city广州/city city深圳/city city珠海/city /cities /province /country 用JSON表示如下 { {name:中国, province:[ { name:黑龙江, cities:{ city:[哈尔滨,大庆] }, {name:广东, cities:{ city:[广州,深圳,珠海] } } 编码的可读性xml有明显的优势毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块读起来就比较费解了。不过我们读起来费解的语言恰恰是适合机器阅读所以通过json的索引.province[0].name就能够读取“黑龙江”这个值。 编码的手写难度来说xml还是舒服一些好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话JSON就是密密麻麻的有用数据而xml却包含很多重复的标记字符。 最新版本: https://github.com/json-c/json-c编译假如出错时:忽略指定库libcmt.lib libcmdtd.lib(debug) 在哪加不用我说吧解析的时候有一点点小问题 :比如 http://baidu.com 解出来后是http:\/baidu.com 需修改原代码 json_object.c 中 json_escape_st函数大约第20行的位置 else if(c /) printbuf_memappend(pb, \\/, 2); 改为else if(c /) printbuf_memappend(pb, /, 1);我是这么做的成功json_object的格式:注意一个json对象内可以包含多个json对象{latitude:116.40091896057129,longitude:39.931129903495886}json_object数组的格式[{latitude:116.40091896057129,longitude:39.931129903495886},{latitude:116.40194892883301,longitude:39.946134395563796},{latitude:116.39645576477051,longitude:39.95488549657055}]序言json提供的方法就是处理基础数据类型在json中冶同为json对象int,bool,float,double等等json类型与{latitude:116.40091896057129,longitude:39.931129903495886}这里面包含了2个json对象而每个json对象{latitude:116.40091896057129}中又包含了一个json对象39.95488549657055json数组一json_object.h创建Json对象json_object_new 开头A创建一个Json对象struct json_object * json_object_new_object (void) B,创建一个Json数组对象struct json_object * json_object_new_array (void)二json_tokener.h将json格式的string转化为json对象的方法失败返回null1.structjson_object* json_tokener_parse(const char *str)//例如json_object *req_json json_tokener_parse( req_buf-buf );三json_object.h将json对象转化为json格式的string失败返回nullconst char * json_object_to_json_string (struct json_object *obj)//将json_object转化为json格式的string,这个方法与后面的json_object_get_string不同大家知道json对象的结构为key:test value :haha 那么to_json_string对象后结构为latitude:116.40091896057129,longitude:39.931129903495886而json_object_get_string仅仅负责对单纯test的json对象转化例如json_object * j_o json_object_new_string(test);char * pointer_char json_object_get_string(j_o); //结果pointer_char 为test四json_object.h向json_object内的增删查无改操作添加void json_object_object_add (struct json_object *obj, const char *key, struct json_object *val)//例如json_object_object_add(item, id, json_object_new_int(_id));查询struct json_object * json_object_object_get (struct json_object *obj, const char *key)删除void json_object_object_del (struct json_object *obj, const char *key)五json_object.h将其他基础数据类型转化为json基础类型的方法1,struct json_object * json_object_new_int (int i) 2,struct json_object * json_object_new_double (double d)3,struct json_object * json_object_new_string (const char *s) 4,struct json_object * json_object_new_boolean (boolean b) 5,struct json_object * json_object_new_string_len (const char *s, int len)(获得s的部分字符串并转换为json对象) 六json_object.h将基础数据类型的Json对象转化为另外一个json对象以及转化为其他基础数据类型json_object_get1,struct json_object * json_object_get (struct json_object *obj)//将json对象转化为另外一个json对象2.struct lh_table * json_object_get_object (struct json_object *obj)//将json_object转化为lh_table3.struct array_list * json_object_get_array (struct json_object *obj) //将 json_object转化为array_list4,boolean json_object_get_boolean (struct json_object *obj)//将json_object转化为boolean5.int json_object_get_int (struct json_object *obj)//将json_object转化为int6,double json_object_get_double (struct json_object *obj)//将json_object 转化为double7.const char * json_object_get_string (struct json_object *obj)//将json_object转化为char *七json_object.h销毁一个json对象void json_object_put (struct json_object *obj) 八json_object.h判断json_object的类型是否为基础数据类型type是0否1int json_object_is_type (struct json_object *obj, enum json_type type) 九json_object.h获得json_object的基础类型enum json_type json_object_get_type (struct json_object *obj) 其中enum json_type 为Enumerator:json_type_null json_type_boolean json_type_double json_type_int json_type_object json_type_array json_type_string 十json_object.hjson数组注意json数组本身也为json_object其为基类1创建json数组struct json_object * json_object_new_array (void) 2将json数组转化为arrayliststruct array_list * json_object_get_array (struct json_object *obj) 3获得json数组的长度int json_object_array_length (struct json_object *obj) 4向json数组obj内添加一个json_objectvalint json_object_array_add (struct json_object *obj, struct json_object *val)其中obj为json数组val为需要添加的对象5Insert or replace an element at a specified index in an array (a json_object of type json_type_array)int json_object_array_put_idx (struct json_object *obj, int idx, struct json_object *val)//向obj中的idx位置update或insert 对象val6获得json数组中的某一特定的对象struct json_object * json_object_array_get_idx (struct json_object *obj, int idx) 3.struct json_object * json_object_object_get (struct json_object *obj, const char *key) //从json_object对象中通过key获得value例如json_object *req_json NULL; json_object_object_get(req_json,ver)); json对象结构 keyvalue过程使用JSON从接收的数据中先查询到相应的对象集体JsonInit比较对象中的key找到需要的对象名把对象名转换为常量字符串 实际使用例子 //解析app发过来的绑定报文 if((pMsgObj json_tokener_parse((LD_S8 *)(pReqMsg1))))//将json格式的string转化为json对象 { while(i 2)//使用JSON从接收的数据中先查询到相应的对象集体JsonInit {//比较对象中的key找到需要的对象名把对象名转换为常量字符串 if((pTmpObj json_object_object_get(pMsgObj, pArgType[i])))从json_object对象中通过key获得value {//value为JSON基础类型JSON对象 break; } i; } if(i 2 || !(pTmpStr json_object_get_string(pTmpObj)))//将JSON基础类型JSON对象转换为字符串 { goto exit1; } } else { //return NULL; goto exit1; } if(!(pBody json_object_new_object()))//创建新的对象 { goto exit1; } //生成向云服务器发起的绑定请求 json_object_object_add(pBody, pArgType[i], json_object_new_string(pTmpStr));//在对象里添加key vaule json_object_object_add(pBody, K_TOKEN, json_object_new_string(token)); if(gpCC-ccArg.resetFlag) { json_object_object_add(pBody, K_RESET_FLAG, json_object_new_boolean(LD_TRUE));//布尔型转换为JSON基础类型 } else { json_object_object_add(pBody, K_RESET_FLAG, json_object_new_boolean(LD_FALSE));//vaule为JSON基础类型 } JsonInit json_tokener_parsejson_object_new_object()json_object_object_add(pResBody, K_TOKEN, json_object_new_string(token));json_object_object_add(pResRoot, K_BODY, pResBody);if((pRootStr json_object_get_string(pResRoot)))// json_object_getobj //将json对象转换为另外一个json对象json_object_get_objectobj//将json对象转换为Ih_table json_object_object_get(resInfo.pResBody, K_RESULT_CODE)查询resInfo.pResBody对象名K_RESULT_CODE常量字符key json_object_put(obj)//销毁一个json对象 json_object_new_array()//创建一个json数组对象json_object_array_add(pListObj, pTmpObj);//pListObj为json数组pTmpObj为需要添加的对象 使用方法pBody json_object_new_object()//创建一个json对象,返回值是一个对象字符串结构体json_object_object_add(pBody, K_TOKEN, json_object_new_string(token));//向对象内增加一对名称/值返回值空pBody为对象K_TOKEN为常量字符keyjson_object_new_string(token)为值json_object_new_string(token)//将其他基础数据类型转换为json基础类型token为常量字符串返回值是一个对象字符串结构体pReqStr json_object_get_string(pBody//将JSON对象名称转换为JSON格式的STRING将json对象转化会char*返回值为const char * 常量字符串 json_object_object_get(resInfo.pResBody, K_RESULT_CODE)返回值是一个对象结构体查询到的查询resInfo.pResBody对象名K_RESULT_CODE常量字符keyjson_object_put(obj)//销毁一个json对象 JSON建构于两种结构 1. “名称/值”对的集合A collection of name/value pairs。不同的语言中它被理解为对象object记录record结构struct字典dictionary哈希表hash table有键列表keyed list或者关联数组 associative array。 按照最简单的形式可以用下面这样的 JSON 表示 名称 / 值对 { firstName: Brett } 2. 值的有序列表An ordered list of values。在大部分语言中它被理解为数组array。{ people: [ { firstName: Brett, lastName:McLaughlin, email: aaaa }, { firstName: Jason, lastName:Hunter, email: bbbb}, { firstName: Elliotte, lastName:Harold, email: cccc } ]}在这个示例中只有一个名为 people的变量值是包含三个条目三个对象元素的数组每个条目是一个人的记录其中包含名、姓和电子邮件地址 转载于:https://www.cnblogs.com/yuweifeng/p/5644534.html