以上就是给各位分享技术点16:JSON,其中也会对技术点斑多久可以脱痂进行解释,同时本文还将给你拓展(持续更新)C#面试技术点、常见SQL技术点和解决高并发的相关技术、Ajax和WEB服务数据格式:J
以上就是给各位分享技术点16:JSON,其中也会对技术点斑多久可以脱痂进行解释,同时本文还将给你拓展(持续更新) C# 面试技术点、常见 SQL 技术点 和 解决高并发的相关技术、Ajax和WEB服务数据格式:JSON JSONP、C++ 的 Json 解析库:jsoncpp 和 boost .、FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- 技术点16:JSON(技术点斑多久可以脱痂)
- (持续更新) C# 面试技术点、常见 SQL 技术点 和 解决高并发的相关技术
- Ajax和WEB服务数据格式:JSON JSONP
- C++ 的 Json 解析库:jsoncpp 和 boost .
- FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换
技术点16:JSON(技术点斑多久可以脱痂)
JSON技术
一、什么是 JSON?
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python等)。 这样就使得 JSON 成为理想的数据交换格式。 json 是一种轻量级的数据交换格式。 轻量级指的是跟 二、JSON 在 JavaScript 中的使用2.1、json 的定义
json 是由键值对组成,并且由花括号(大括号)包围。每个键由引号引起来,键和值之间使用冒号进行分隔,多组键值对之间进行逗号进行分隔。 示例:// json的定义 var jsonObj = { "key1":12, "key2":"abc", "key3":true, "key4":[11,"arr",false], "key5":{ "key5_1":551, "key5_2":"key5_2_value" }, "key6":[{ "key6_1_1":6611, "key6_1_2":"key6_1_2_value" },{ "key6_2_1":6621, "key6_2_2":"key6_2_2_value" }] }
2.2、json的访问
json 本身是一个对象。 json 中的 key 我们可以理解为是对象中的一个属性。 json 中的 key 访问就跟访问对象的属性一样: json 对象.key 示例:// json的访问 alert(typeof(jsonObj));//object json就是一个对象 alert(jsonObj.key1);//12 alert(jsonObj.key2);//abc alert(jsonObj.key3);//true alert(jsonObj.key4);//得到数组[11,"arr",false] //json中数组的遍历 for (var i = 0; i < jsonObj.key4.length; i++){ alert(jsonObj.key4[i]); } alert(jsonObj.key5.key5_1);//551 alert(jsonObj.key5.key5_2);//key5_2_value alert(jsonObj.key6);//得到json数组 //取出来每一个元素都是json对象 var jsonItem = jsonObj.key6[0]; alert(jsonItem.key6_1_1);//6611 alert(jsonItem.key6_1_2);//key6_1_2_value
2.3、json 的两个常用方法
json 的存在有两种形式。 一种是:对象的形式存在,我们叫它 json 对象。 一种是:字符串的形式存在,我们叫它 json 字符串。 一般我们要操作 json 中的数据的时候,需要 json 对象的格式。一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。 JSON.stringify() 把 json 对象转换成为 json 字符串JSON.parse() 把 json 字符串转换成为 json 对象 示例:// json对象转字符串 var jsonString = JSON.stringify(jsonObj); alert(jsonString); // json字符串转json对象 var jsonObj2 = JSON.parse(jsonString); alert(jsonObj2); alert(jsonObj2.key1);//12 alert(jsonObj2.key2);//abc
三、JSON 在 java 中的使用
主要是类型的转换,需要用到如下的jar包:
创建Person.java类:
3.1、javaBean 和 json 的互转
@Test public void test1(){ Person per.........
(持续更新) C# 面试技术点、常见 SQL 技术点 和 解决高并发的相关技术
这篇博客 持续更新. |
方便小伙伴们学习与面试前的复习 |
- 文中的错误
- 更好的答案
- 建议增加的知识点
- 有更好的建议
- …
❤️ ❤️欢迎大家在评论区留言 ❤️ ❤️
文章目录
- 更新日志
- C#
- 面试题
- 常用轮子
- SQL Server
- SQL 优化
- SQL 题
- 高并发系列
- 缓存
- Redis
- 消息队列
- RabbitMQ
更新日志
时间 | 更新内容 |
---|---|
2019.06.20 | ➕增加 "常用轮子" 栏目 |
2019.05.27 | ➕增加 "高并发系列" 栏目 |
2019.05.16 | ➕增加 “SQL 优化” 栏目 |
2019.05.14 | ➕增加 “目录” |
2019.05.13 | ⭕️初次更新 |
C#
面试题
点击前往 ----> C# 面试题
常用轮子
点击前往 ----> C#/Java 常用轮子
SQL Server
SQL 优化
点击前往 ----> SQL 优化
SQL 题
点击前往 ---->SQL 题
高并发系列
缓存
Redis
点击前往 ----> Redis 面试问答
消息队列
RabbitMQ
点击前往 ----> RabbitMQ 面试问答
Ajax和WEB服务数据格式:JSON JSONP
总结
以上是小编为你收集整理的Ajax和WEB服务数据格式:JSON JSONP全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
C++ 的 Json 解析库:jsoncpp 和 boost .
JSON(JavaScript Object Notation) 跟 xml 一样也是一种数据交换格式,了解 json 请参考其官网 http://json.org/,本文不再对 json 做介绍,将重点介绍 c++ 的 json 解析库的使用方法。json 官网上列出了各种语言对应的 json 解析库,作者仅介绍自己使用过的两种 C++ 的 json 解析库:jsoncpp (v0.5.0) 和 Boost (v1.34.0)。
一。使用 jsoncpp 解析 json
Jsoncpp 是个跨平台的开源库,首先从 http://jsoncpp.sourceforge.net/ 上下载 jsoncpp 库源码,我下载的是 v0.5.0,压缩包大约 107K,解压,在 jsoncpp-src-0.5.0/makefiles/vs71 目录里找到 jsoncpp.sln,用 VS2003 及以上版本编译,默认生成静态链接库。 在工程中引用,只需要 include/json 及.lib 文件即可。
使用 JsonCpp 前先来熟悉几个主要的类:
Json::Value 可以表示里所有的类型,比如 int,string,object,array 等,具体应用将会在后边示例中介绍。
Json::Reader 将 json 文件流或字符串解析到 Json::Value, 主要函数有 Parse。
Json::Writer 与 Json::Reader 相反,将 Json::Value 转化成字符串流,注意它的两个子类:Json::FastWriter 和 Json::StyleWriter,分别输出不带格式的 json 和带格式的 json。
1. 从字符串解析 json
- int ParseJsonFromString()
- {
- const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
- Json::Reader reader;
- Json::Value root;
- if (reader.parse(str, root)) // reader 将 Json 字符串解析到 root,root 将包含 Json 里所有子元素
- {
- std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000"
- int code = root["code"].asInt(); // 访问节点,code = 100
- }
- return 0;
- }
int ParseJsonFromString()
{
const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
Json::Reader reader;
Json::Value root;
if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000"
int code = root["code"].asInt(); // 访问节点,code = 100
}
return 0;
}
2. 从文件解析 json
json 文件内容:
- {
- "uploadid": "UP000000",
- "code": "0",
- "msg": "",
- "files":
- [
- {
- "code": "0",
- "msg": "",
- "filename": "1D_16-35_1.jpg",
- "filesize": "196690",
- "width": "1024",
- "height": "682",
- "images":
- [
- {
- "url": "fmn061/20111118",
- "type": "large",
- "width": "720",
- "height": "479"
- },
- {
- "url": "fmn061/20111118",
- "type": "main",
- "width": "200",
- "height": "133"
- }
- ]
- }
- ]
- }
{
"uploadid": "UP000000",
"code": "0",
"msg": "",
"files":
[
{
"code": "0",
"msg": "",
"filename": "1D_16-35_1.jpg",
"filesize": "196690",
"width": "1024",
"height": "682",
"images":
[
{
"url": "fmn061/20111118",
"type": "large",
"width": "720",
"height": "479"
},
{
"url": "fmn061/20111118",
"type": "main",
"width": "200",
"height": "133"
}
]
}
]
}
解析代码:
- int ParseJsonFromFile(const char* filename)
- {
- // 解析 json 用 Json::Reader
- Json::Reader reader;
- // Json::Value 是一种很重要的类型,可以代表任意类型。如 int, string, object, array...
- Json::Value root;
- std::ifstream is;
- is.open (filename, std::ios::binary );
- if (reader.parse(is, root))
- {
- std::string code;
- if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
- code = root["uploadid"].asString();
- // 访问节点,Return the member named key if it exist, defaultValue otherwise.
- code = root.get("uploadid", "null").asString();
- // 得到 "files" 的数组个数
- int file_size = root["files"].size();
- // 遍历数组
- for(int i = 0; i < file_size; ++i)
- {
- Json::Value val_image = root["files"][i]["images"];
- int image_size = val_image.size();
- for(int j = 0; j < image_size; ++j)
- {
- std::string type = val_image[j]["type"].asString();
- std::string url = val_image[j]["url"].asString();
- }
- }
- }
- is.close();
- return 0;
- }
int ParseJsonFromFile(const char* filename)
{
// 解析json用Json::Reader
Json::Reader reader;
// Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array...
Json::Value root;
std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root))
{
std::string code;
if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
code = root["uploadid"].asString();
// 访问节点,Return the member named key if it exist, defaultValue otherwise.
code = root.get("uploadid", "null").asString();
// 得到"files"的数组个数
int file_size = root["files"].size();
// 遍历数组
for(int i = 0; i < file_size; ++i)
{
Json::Value val_image = root["files"][i]["images"];
int image_size = val_image.size();
for(int j = 0; j < image_size; ++j)
{
std::string type = val_image[j]["type"].asString();
std::string url = val_image[j]["url"].asString();
}
}
}
is.close();
return 0;
}
3. 在 json 结构中插入 json
- Json::Value arrayObj; // 构建对象
- Json::Value new_item, new_item1;
- new_item["date"] = "2011-12-28";
- new_item1["time"] = "22:30:36";
- arrayObj.append(new_item); // 插入数组成员
- arrayObj.append(new_item1); // 插入数组成员
- int file_size = root["files"].size();
- for(int i = 0; i < file_size; ++i)
- root["files"][i]["exifs"] = arrayObj; // 插入原 json 中
Json::Value arrayObj; // 构建对象
Json::Value new_item, new_item1;
new_item["date"] = "2011-12-28";
new_item1["time"] = "22:30:36";
arrayObj.append(new_item); // 插入数组成员
arrayObj.append(new_item1); // 插入数组成员
int file_size = root["files"].size();
for(int i = 0; i < file_size; ++i)
root["files"][i]["exifs"] = arrayObj; // 插入原json中
4. 输出 json
- // 转换为字符串(带格式)
- std::string out = root.toStyledString();
- // 输出无格式 json 字符串
- Json::FastWriter writer;
- std::string out2 = writer.write(root);
// 转换为字符串(带格式)
std::string out = root.toStyledString();
// 输出无格式json字符串
Json::FastWriter writer;
std::string out2 = writer.write(root);
二。使用 Boost property_tree 解析 json
property_tree 可以解析 xml,json,ini,info 等格式的数据,用 property_tree 解析这几种格式使用方法很相似。
解析 json 很简单,命名空间为 boost::property_tree,reson_json 函数将文件流、字符串解析到 ptree,write_json 将 ptree 输出为字符串或文件流。其余的都是对 ptree 的操作。
解析 json 需要加头文件:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
1. 解析 json
解析一段下面的数据:
- {
- "code": 0,
- "images":
- [
- {
- "url": "fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg"
- },
- {
- "url": "fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg"
- }
- ]
- }
{
"code": 0,
"images":
[
{
"url": "fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg"
},
{
"url": "fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg"
}
]
}
- int ParseJson()
- {
- std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
- using namespace boost::property_tree;
- std::stringstream ss(str);
- ptree pt;
- try{
- read_json(ss, pt);
- }
- catch(ptree_error & e) {
- return 1;
- }
- try{
- int code = pt.get<int>("code"); // 得到 "code" 的 value
- ptree image_array = pt.get_child("images"); // get_child 得到数组对象
- // 遍历数组
- BOOST_FOREACH(boost::property_tree::ptree::value_type &v, image_array)
- {
- std::stringstream s;
- write_json(s, v.second);
- std::string image_item = s.str();
- }
- }
- catch (ptree_error & e)
- {
- return 2;
- }
- return 0;
- }
int ParseJson()
{
std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
using namespace boost::property_tree;
std::stringstream ss(str);
ptree pt;
try{
read_json(ss, pt);
}
catch(ptree_error & e) {
return 1;
}
try{
int code = pt.get<int>("code"); // 得到"code"的value
ptree image_array = pt.get_child("images"); // get_child得到数组对象
// 遍历数组
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, image_array)
{
std::stringstream s;
write_json(s, v.second);
std::string image_item = s.str();
}
}
catch (ptree_error & e)
{
return 2;
}
return 0;
}
2. 构造 json
- int InsertJson()
- {
- std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
- using namespace boost::property_tree;
- std::stringstream ss(str);
- ptree pt;
- try{
- read_json(ss, pt);
- }
- catch(ptree_error & e) {
- return 1;
- }
- // 修改 / 增加一个 key-value,key 不存在则增加
- pt.put("upid", "00001");
- // 插入一个数组
- ptree exif_array;
- ptree array1, array2, array3;
- array1.put("Make", "NIKON");
- array2.put("DateTime", "2011:05:31 06:47:09");
- array3.put("Software", "Ver.1.01");
- exif_array.push_back(std::make_pair("", array1));
- exif_array.push_back(std::make_pair("", array2));
- exif_array.push_back(std::make_pair("", array3));
- // exif_array.push_back(std::make_pair("Make", "NIKON"));
- // exif_array.push_back(std::make_pair("DateTime", "2011:05:31 06:47:09"));
- // exif_array.push_back(std::make_pair("Software", "Ver.1.01"));
- pt.put_child("exifs", exif_array);
- std::stringstream s2;
- write_json(s2, pt);
- std::string outstr = s2.str();
- return 0;
- }
int InsertJson()
{
std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
using namespace boost::property_tree;
std::stringstream ss(str);
ptree pt;
try{
read_json(ss, pt);
}
catch(ptree_error & e) {
return 1;
}
// 修改/增加一个key-value,key不存在则增加
pt.put("upid", "00001");
// 插入一个数组
ptree exif_array;
ptree array1, array2, array3;
array1.put("Make", "NIKON");
array2.put("DateTime", "2011:05:31 06:47:09");
array3.put("Software", "Ver.1.01");
exif_array.push_back(std::make_pair("", array1));
exif_array.push_back(std::make_pair("", array2));
exif_array.push_back(std::make_pair("", array3));
// exif_array.push_back(std::make_pair("Make", "NIKON"));
// exif_array.push_back(std::make_pair("DateTime", "2011:05:31 06:47:09"));
// exif_array.push_back(std::make_pair("Software", "Ver.1.01"));
pt.put_child("exifs", exif_array);
std::stringstream s2;
write_json(s2, pt);
std::string outstr = s2.str();
return 0;
}
三。两种解析库的使用经验
1. 用 boost::property_tree 解析字符串遇到 "\/" 时解析失败,而 jsoncpp 可以解析成功,要知道 ''/'' 前面加一个 ''\'' 是 JSON 标准格式。
2. boost::property_tree 的 read_json 和 write_json 在多线程中使用会引起崩溃。
针对 1,可以在使用 boost::property_tree 解析前写个函数去掉 "\/" 中的 ''\'',针对 2,在多线程中同步一下可以解决。
我的使用心得:使用 boost::property_tree 不仅可以解析 json,还可以解析 xml,info 等格式的数据。对于解析 json,使用 boost::property_tree 解析还可以忍受,但解析 xml,由于遇到问题太多只能换其它库了。
FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换
当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台
例如:
nodes = $(''#PmPbsSelect_tree'').tree(''getChecked'');
var data=[];
for(var i=0;i<nodes.length;i++){
if(!isParentCheck(nodes[i],nodes)){
data.push({"id":nodes[i].id,
"pid":node.id});
}else{
data.push({"id":nodes[i].id,
"pid":null});
}
}
dataStr=JSON.stringify(data);
$.ajax({
url:ctx+"/PmWbs/savePmWbsByModel",
type:"POST",
data:{"dataStr":dataStr,
"projectId":pmProjectSelect.combobox(''getValue'')},
success:function(data){
basetree.tree(''reload'');
},
error:function(){
alert("请求失败");
},
dataType:"json"
});
接下来阐述正文:(其实是copy其他人的博客,主要放在自己博客下面好找...........................)
==================华丽的分割线=======================================
fastJson对于json格式字符串的解析主要用到了一下三个类:
JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
JSONObject:fastJson提供的json对象。
JSONArray:fastJson提供json数组对象。
首先定义了三个json格式的字符串作为我们的数据源
//json字符串-简单对象型
private static final String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
//json字符串-数组类型
private static final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
//复杂格式json字符串
private static final String COMPLEX_JSON_STR = "{\"teacherName\":\"crystall\",
\"teacherAge\":27,\"course\":{\"courseName\":\"english\",\"code\":1270},
\"students\":[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]}";
一、JSON格式字符串与JSON对象之间的转换。
1.json字符串-简单对象型 与 JSONObject之间的转换
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
//因为JSONObject继承了JSON,所以这样也是可以的
//JSONObject jsonObject1 = JSONObject.parseObject(JSON_OBJ_STR);
2.json字符串-数组类型与JSONArray之间的转换
JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
//因为JSONArray继承了JSON,所以这样也是可以的
//JSONArray jsonArray1 = JSONArray.parseArray(JSON_ARRAY_STR);
//遍历方式1
int size = jsonArray.size();
for (int i = 0; i < size; i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
}
//遍历方式2
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
}
3.复杂json格式字符串与JSONObject之间的转换
JSONObject jsonObject = JSON.parseObject(COMPLEX_JSON_STR);
//因为JSONObject继承了JSON,所以这样也是可以的
//JSONObject jsonObject1 = JSONObject.parseObject(COMPLEX_JSON_STR);
String teacherName = jsonObject.getString("teacherName");
Integer teacherAge = jsonObject.getInteger("teacherAge");
JSONObject course = jsonObject.getJSONObject("course");
JSONArray students = jsonObject.getJSONArray("students");
此时获取到了json字符串的数组,再对各个字符串进行解析
二、JSON格式字符串与javaBean之间的转换
首先,我们针对数据源所示的字符串,提供三个javaBean。
public class Student {
private String studentName;
private Integer studentAge;
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getStudentAge() {
return studentAge;
}
public void setStudentAge(Integer studentAge) {
this.studentAge = studentAge;
}
}
public class Course {
private String courseName;
private Integer code;
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
public class Teacher {
private String teacherName;
private Integer teacherAge;
private Course course;
private List<Student> students;
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public Integer getTeacherAge() {
return teacherAge;
}
public void setTeacherAge(Integer teacherAge) {
this.teacherAge = teacherAge;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
json字符串与javaBean之间的转换推荐使用 TypeReference<T> 这个类,使用泛型可以更加清晰,当然也有其它的转换方式,这里就不做探讨了。
1.json字符串-简单对象型与javaBean之间的转换
Student student = JSON.parseObject(JSON_OBJ_STR, new TypeReference<Student>() {});
//因为JSONObject继承了JSON,所以这样也是可以的
//Student student1 = JSONObject.parseObject(JSON_OBJ_STR, new TypeReference<Student>() {});
2.json字符串-数组类型与javaBean之间的转换
ArrayList<Student> students = JSON.parseObject(JSON_ARRAY_STR, new TypeReference<ArrayList<Student>>() {});
//因为JSONArray继承了JSON,所以这样也是可以的
//ArrayList<Student> students1 = JSONArray.parseObject(JSON_ARRAY_STR, new TypeReference<ArrayList<Student>>() {});
今天关于技术点16:JSON和技术点斑多久可以脱痂的讲解已经结束,谢谢您的阅读,如果想了解更多关于(持续更新) C# 面试技术点、常见 SQL 技术点 和 解决高并发的相关技术、Ajax和WEB服务数据格式:JSON JSONP、C++ 的 Json 解析库:jsoncpp 和 boost .、FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换的相关知识,请在本站搜索。
本文标签: