json数据解析

2023-09-13 15:37:03

目录

一、读数据

 1、简单对象读取

2、数组读取

3、对象读取

二、写数据

1、简单生成JSON

2、对象数组JSON

3、嵌套对象

三、一个综合例子

1、读JSON

2、写JSON


一、读数据

 1、简单对象读取

{
  "app": "xnwVideo",
  "src": "C:\\build-video\\Output",
  "dest": "C:\\build-video\\1.0.32",
  "version": "1.0.32",
  "build": 32,
  "note": "布局json读取",
  "act": "All"
}

		CBinBuf buf;
		buf.ReadFile("jsonInfo.json");
		CJsonObj json(buf);

		CBinBuf app, src, des, note, build, fullVersion, act;
		json.getString("app", app);
		json.getString("src", src);
		json.getString("dest", des);
		json.getString("note", note);
		json.getString("build", build);
		json.getString("version", fullVersion);
		json.getString("act", act);

2、数组读取

文件如下:

[
  {
    "id": "Integrated Webcam:\\\\?\\usb#22vid_0c45&pid_671f&mi_00#226&8c5ffc6&0&0000#22{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global",
    "res": "1280x720"
  },
  {
    "id": "XSplit VCam:\\\\?\\root#22image#220000#22{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global",
    "res": "1280x720"
  },
  {
    "id": "YY开播:",
    "res": "1280x720"
  },
  {
    "id": "c922 Pro Stream Webcam:\\\\?\\usb#22vid_046d&pid_085c&mi_00#227&1e59b99a&0&0000#22{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global",
    "res": "1920x1080"
  }
]

读取方式:

	std::map<std::string, std::string > camIDResMap_;


	CBinBuf buf;
	buf.ReadFile(jsonPath.c_str());
	CJsonObj json(buf);

	for (int i = 0; i < json.get_arry_size(); ++i)
	{
		CJsonObj * pJson = json.get_arry_at(i);
		string id, res;
		pJson->getString("id", id);
		pJson->getString("res", res);

		camIDResMap_[id] = res;
	}

类似的还有:

			for (int i = 0; i < class_info->get_arry_size(); ++i) {
				CJsonObj* pJson = class_info->get_arry_at(i);

				std::string courseID, chapterID, qID, chapterName, startTime, endTime, className, imgUrl;
				int nStatus;

				pJson->getString("course.id", courseID);
				pJson->getString("id", chapterID);				
				pJson->getString("class.qid", qID);


				pJson->getString("name", chapterName);
				
				pJson->getString("start_time", startTime);
				pJson->getString("end_time", endTime);
				nStatus = pJson->getInt("live_status");

				/*
								CJsonObj* pCourseJson = pJson->getObj("course", err);
								pCourseJson->getString("name", className);								
								pCourseJson->getString("cover_url", imgUrl);
				*/
				
				pJson->getString("course.name", className);
				pJson->getString("course.cover_url", imgUrl);
				


				//time
				long iStartTime = atoi(startTime.c_str());
				long iEndTime = atoi(endTime.c_str());
				std::string timeStr = GetTimeStr(iStartTime, iEndTime);

				//添加列表中
				ui::ListContainerElement* pItem = dynamic_cast<ui::ListContainerElement*>(ui::GlobalManager::CreateBoxWithCache(L"myClass/myclass_list_item.xml"));
				myClass_list->Add(pItem);


				if (curCourseId==courseID&&curChapterId==chapterID)
				{
					m_pCurItem = pItem; //刷新后,重置当前节点

					bCurItemReseted = TRUE;
				}


			
				//详细信息设置
				SetText(pItem, L"courseName", nbase::UTF8ToUTF16(className).c_str());
				SetText(pItem, L"chapterName", nbase::UTF8ToUTF16(chapterName).c_str());
				SetText(pItem, L"time", MyString::stows(timeStr).c_str());//asic->utf
				SetDataID(pItem, L"time", startTime);
				SetDataID(pItem, L"courseName", endTime);    //此项利用上,保存这节课结束时间


				std::wstring statusStr;
				switch (nStatus)
				{
				case 0:
					statusStr = L"未开始";
					break;

				case 1:
					statusStr = L"正在直播";
					break;
				case 4:
					statusStr = L"正在直播";
					break;

				case 2:
					statusStr = L"已结束";
					break;

				case 3:
					statusStr = L"缺课";
					break;
				}
				SetText(pItem, L"live_status", statusStr);


				ui::Control* pClassPhoto = (ui::Control*)pItem->FindSubControl(L"classPhoto");
				if (pClassPhoto)
				{
					//根据Json  传来的照片网址,与本地地址映射
					//之所以加?做分隔符,是因为文件名不能包含?

					std::wstring url = nbase::UTF8ToUTF16(imgUrl);

					//此段代码用于线程下载时使用
					std::wstring IndexStr = std::to_wstring(i);
					std::wstring pathTemp = MyString::format(L"tmp\\classPhoto%s.png", IndexStr.c_str());
					std::wstring localPath = IndexStr + L"?" + localFoldPathW + pathTemp;
					std::wstring remotePath = IndexStr + L"|" + url;
					AddMapItem(remotePath, localPath);
					///

					xnw_http_download(imgUrl.c_str(), GetHWND(), i);
				}

				ui::Button* pEnterLSRoomBtn = (ui::Button*)pItem->FindSubControl(L"enterLiveRoom_Btn");				
				pEnterLSRoomBtn->AttachClick(nbase::Bind(&MyClassForm::EnterRoom, this, std::placeholders::_1));
			
				pItem->SetUTF8DataID(courseID); //设置item标识为章节ID
				pEnterLSRoomBtn->SetUTF8DataID(chapterID);
				pClassPhoto->SetUTF8DataID(qID);
			}

			if (!bCurItemReseted)
			{
				m_pCurItem = NULL;
			}
		}

3、对象读取

{
  "list": [
    {
      "name": "亮度92",
      "props": {
        "BacklightCompensation": 1,
        "Brightness": 92,
        "ColorEnable": 16,
        "Contrast": 91,
        "Gain": 16,
        "Gamma": 62,
        "Hue": 91,
        "Saturation": 255,
        "Sharpness": 62,
        "WhiteBalance": -1
      },
      "control": {
        "Exposure": -4,
        "Focus": 0,
        "Iris": 100,
        "Pan": 0,
        "Roll": 0,
        "Tilt": 0,
        "Zoom": 100
      }
    },
    {
      "name": "高亮170",
      "props": {
        "BacklightCompensation": 0,
        "Brightness": 170,
        "ColorEnable": 3,
        "Contrast": 128,
        "Gain": 3,
        "Gamma": 188,
        "Hue": 128,
        "Saturation": 128,
        "Sharpness": 188,
        "WhiteBalance": -1
      },
      "control": {
        "Exposure": -4,
        "Focus": 0,
        "Iris": 100,
        "Pan": 0,
        "Roll": 0,
        "Tilt": 0,
        "Zoom": 100
      }
    }
  ]
}

对象的值又是数组的情况下,读取方式


	CJsonObj ampJson(jsonS.c_str());

	{
		int nCount = 0;
		int err;

		CJsonObj* arry = ampJson.getObj("list", err);
		if (arry && arry->isarray()) {
			nCount = arry->get_arry_size();
			std::string s;
			std::wstring name;

			for (int i = 0; i < arry->get_arry_size(); ++i) {

				CJsonObj* pJson = arry->get_arry_at(i);
				pJson->getString("name", s);
				name = to_wchar_t(s);

				g_SelfCamAmpPropNameVec.push_back(name);
			}

		}
	}

类似的还有

    CBinBuf bfJson;
    if(bfJson.ReadFile(m_file)) {
        load(bfJson, 0);
    void load(const char* jstr, int merge) {
        uint32_t now = (uint32_t)time(0);
        CJsonObj js(jstr);
        m_tm = js.getInt("tm", 0);
        m_tmReport = js.getInt("tmReport", now);
        int err;
        CJsonObj* pList = js.getObj("list", err);
        if(pList) {
            std::vector<CDNINFO> v, vOld;
            if(merge) {
                for(int i=0; i<m_vCdn.size(); ++i) vOld.push_back(m_vCdn[i]);
            }
            m_vCdn.clear();
            for(int i=0; i<pList->get_arry_size(); ++i) {
                CDNINFO c;
                CJsonObj* pItem = pList->get_arry_at(i);
                c.from(pItem);
                add(c, merge, vOld);
            }
        }
    }


 

二、写数据

1、简单生成JSON

	CJsonString bf("{");
	bf.append_item("file", szUtf8);
	bf.append_item("url", cbitem->url);
	bf.append_item("wparam",(uint64_t)cbitem->wParam);
	bf.close("}");

  又如,

void MakeDefaultJson(CJsonString &jsonStr){

	jsonStr.append_item("is_beauty_on", 1); //美颜全局开关,0为关,1为开,默认为1

	//滤镜 
	jsonStr.append_item("filter_level", 0);   //0-10  ->[0,1] 取值范围 0.0-1.0,0.0为无效果,1.0为最大效果,默认值1.0
	jsonStr.append_item("filter_name", "origin");

	//美白
	jsonStr.append_item("color_level", 2);    //0-20  [0,2.0] 取值范围 0.0-2.0,0.0为无效果,2.0为最大效果,默认值0.2
	//红润
	jsonStr.append_item("red_level", 5);      //0-20  [0,2.0] 取值范围 0.0-2.0,0.0为无效果,2.0为最大效果,默认值0.5

	//磨皮程度
	jsonStr.append_item("blur_level", 60);        //[0,6.0] 磨皮程度,取值范围0.0-6.0,默认6.0
	jsonStr.append_item("skin_detect", 0);        //肤色检测开关,0为关,1为开 默认0
	jsonStr.append_item("nonskin_blur_scale", 0); //0-10 [0,1]肤色检测之后非肤色区域的融合程度,取值范围0.0-1.0,默认0.0

	jsonStr.append_item("heavy_blur", 0);         //朦胧磨皮开关,0为清晰磨皮,1为朦胧磨皮
	jsonStr.append_item("blur_type", 2);          //此参数优先级比heavy_blur低,在使用时要将heavy_blur设为0,0 清晰磨皮  1 朦胧磨皮  2精细磨皮
	jsonStr.append_item("blur_use_mask", 0);      //ios端默认为1,其他端默认为0。1为开启基于人脸的磨皮mask,0为不使用mask正常磨皮。只在blur_type为2时生效。

	jsonStr.append_item("sharpen", 2);            //锐化程度,取值范围0.0-1.0,默认0.2

	jsonStr.close();
	//jsonStr.WriteFile("jsonInfoRes.json");
}

2、对象数组JSON

	CJsonString jsonStr;
	jsonStr.begin("[");

	for (auto &it : camIDResMap)
	{
		CJsonString camJson;
		camJson.begin("{");
		camJson.append_item("id", it.first.c_str());
		camJson.append_item("res", it.second.c_str());

		camJson.close("}");
		jsonStr.append_obj(camJson);
	}

	jsonStr.close("]");

	jsonStr.WriteFile(m_camjsonPath);

3、嵌套对象

{
  "list": [
    {
      "name": "亮度92",
      "props": {
        "BacklightCompensation": 1,
        "Brightness": 92
      },
      "control": {
        "Exposure": -4,
        "Zoom": 100
      }
    },
    {
      "name": "高亮170",
      "props": {
        "BacklightCompensation": 0,
        "WhiteBalance": -1
      },
      "control": {
        "Exposure": -4,
        "Zoom": 100
      }
    }
  ]
}


	CJsonString jsonStr;
	jsonStr.begin("[");

	int nCount = 0;

	for (auto &it : selfCamPros_)
	{
		std::map<std::string, int> &ampMap = it.second;
		std::wstring nameW = it.first;

		std::map<std::string, int> &ctlMap = selfCamControls_[nameW];

		std::string name = to_string(nameW);

		CJsonString camAllJson;
		camAllJson.begin("{");
		camAllJson.append_item("name", name.c_str());

		CJsonString ampJsonObj;
		ampJsonObj.begin("{");
		auto oneAmpIt = ampMap.begin();
		while (oneAmpIt != ampMap.end())
		{
			ampJsonObj.append_item(oneAmpIt->first.c_str(), oneAmpIt->second);
			oneAmpIt++;
		}

		ampJsonObj.close("}");
		camAllJson.append_obj("props", ampJsonObj);


		CJsonString ctlJsonObj;
		ctlJsonObj.begin("{");
		auto oneCtlIt = ctlMap.begin();
		while (oneCtlIt != ctlMap.end())
		{
			ctlJsonObj.append_item(oneCtlIt->first.c_str(), oneCtlIt->second);
			oneCtlIt++;
		}
		ctlJsonObj.close("}");
		camAllJson.append_obj("control", ctlJsonObj);



		camAllJson.close("}");


		jsonStr.append_obj(camAllJson);
	}

	jsonStr.close("]");


	CJsonString listObjJsonS;
	listObjJsonS.begin("{");
	listObjJsonS.append_obj("list", jsonStr);
	listObjJsonS.close("}");


	listObjJsonS.WriteFile(sysJsonPath);

又如,

        CJsonString js, list;
        js.append_item_u32("tm", m_tm);
        js.append_item_u32("tmReport", m_tmReport);
        format_json(list);
        js.append_obj("list", list);
        js.close("}");
        js.WriteFile(m_file);
    void format_json(CJsonString& js) {
        js.begin("[");
        size_t n = m_vCdn.size();
        for(int i=0; i<n; ++i) {
            CDNINFO& c = m_vCdn[i];
            CJsonString cdn;
            c.format(cdn);
            js.append_obj(cdn);
        }
        js.close("]");
    }


又如,

		CJsonString js,list;
		list.begin("[");

		for (auto it = nameVec.begin(); it != nameVec.end(); it++)
		{

			CJsonString jsObj;
			std::wstring name = *it;

			if (name == L"类别")
				continue;

			std::string name8 = nbase::UTF16ToUTF8(name);

			jsObj.begin("{");
			jsObj.append_item("name", name8.c_str());
			jsObj.close("}");

			list.append_obj(jsObj);
		}
		list.close("]");

		js.append_obj("list", list);
		js.close("}");
		js.WriteFile("d:\\name.json");

三、一个综合例子

{
  "nameArr": [
    {
      "account": "张三"
    },
    {
      "account": "王五"
    },
    {
      "account": "李四"
    }
  ],
  "phoneArr": [
    {
      "account": "1800000"
    }
  ]
}

1、读JSON

	std::set<std::wstring> acountSet_;

	std::set<std::wstring> acountPhoneSet_;


void ReadAcountSet()
{
	std::string path = GetXnwAccountJsonPath();

	CBinBuf buf;
	if (buf.Read(path.c_str()))
	{
		CJsonObj json(buf);
		int err;
		CJsonObj* arry = json.getObj("nameArr", err);
		if (arry && arry->isarray())
		{
		
			for (int i = 0; i < arry->get_arry_size(); ++i)
			{
				CJsonObj * pJson = arry->get_arry_at(i);
				std::string name;
				pJson->getString("account", name);

				if (!name.empty())
				{
					std::wstring namew = nbase::UTF8ToUTF16(name);
					acountSet_.insert(namew);
				}


			}

		}

		arry = json.getObj("phoneArr", err);
		if (arry && arry->isarray())
		{

			for (int i = 0; i < arry->get_arry_size(); ++i)
			{
				CJsonObj * pJson = arry->get_arry_at(i);
				std::string name;
				pJson->getString("account", name);

				std::wstring namew = nbase::UTF8ToUTF16(name);
				acountPhoneSet_.insert(namew);

			}

		}


	}

}

2、写JSON

void SaveAcountSet(){

	std::string path = GetXnwAccountJsonPath();

	CJsonString listJsonStr;
	listJsonStr.begin("{");

	CJsonString jsonStr;
	jsonStr.begin("[");


	for (auto &it : acountSet_)
	{
		std::string name = nbase::UTF16ToUTF8(it);
		CJsonString json;

		json.begin("{");
		json.append_item("account", name.c_str());
		json.close("}");

		jsonStr.append_obj(json);
	}

	jsonStr.close("]");

	listJsonStr.append_obj("nameArr", jsonStr);


	CJsonString jsonStr2;
	jsonStr2.begin("[");
	for (auto &it : acountPhoneSet_)
	{
		std::string name = nbase::UTF16ToUTF8(it);
		CJsonString json;

		json.begin("{");
		json.append_item("account", name.c_str());
		json.close("}");

		jsonStr2.append_obj(json);
	}

	jsonStr2.close("]");

	listJsonStr.append_obj("phoneArr", jsonStr2);
	listJsonStr.close("}");

	listJsonStr.WriteFile(path.c_str());
}

更多推荐

免备案海外服务器有什么好处?

介绍一:了解海外服务器免备案的优点免备案海外服务器是指在国外搭建网站服务器而不是在国内备案,这种模式可以带来一定的便利。首先,海外服务器免备案可以使网站更加稳定,因为国外网络环境更加稳定,大多数国外服务器性能高,可以保证网站的正常运行,也可以使网站的响应时间更快。其次,海外服务器免备案还可以保证网站数据的安全性。国外服

TCP协议详解

TCP协议特点:面向连接、字节流、可靠传输。面向连接:使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该链接分配必要的内河资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,双方的数据读写可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。字节流:发送端

Docker的相关知识介绍以及mac环境的安装

一、什么是Docker大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:依赖关系复杂,容易出现兼容性问题开发、测试、生产环境有差异Docker就是来解决这些问题的。Docker是一个快速交付应用、运行应用的技术:可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。运行时利用沙箱机

2023.9.21 组会记录

Robustdiseasemoduleminingviaenumerationofdiverseprize-collectingSteinertrees通过枚举多样的奖励收集斯坦纳树进行鲁棒的疾病模块挖掘疾病模块挖掘方法(DMMM)已被开发出来,将基因表达谱的分析与蛋白质-蛋白质相互作用(PPI)和其他网络中编码的先验

小步快跑,敏捷开发的精髓!

每日站会,两周一迭代,有自己的“ScrumMaster”,就是敏捷实践?No!具备敏捷之形的团队有很多,但是,真正掌握敏捷精髓的,却并不多见。这是因为,敏捷方法属于simplebutnoteasy(简单但并不好做)。结合我这么多年的体会来看,与其说敏捷是一场研发方式的变革,不如说是一场思维方式的变革。今天,结合我在某试

python基于django或flask开发的健身俱乐部网站rix1z

本系统有三个角色:管理员、用户和教练,要求具备以下功能:(1)用户可以浏览主页了解健身课程、健身器材、会员卡信息、新闻公告等信息,并进行在线留言;(2)管理员通过后台管理员界面,实现对用户信息管理,可以查看健身课程、健身器材等信息,让用户实时知道最新的健身俱乐部管理信息;技术栈后端:python+django前端:vu

鼠标不动了怎么办?3招解决问题!

“这是怎么回事呢?我的鼠标怎么会用着用着就突然不动了呢?现在有一些比较重要的工作要处理。请问有什么方法可以快速解决这个问题吗?”随着电脑在我们日常生活和工作中的广泛应用,鼠标是我们操作电脑不可或缺的工具之一。但是,有时候我们可能会遇到鼠标不动的问题,这会影响到我们使用电脑。鼠标不动了怎么办?今天小编就来告诉大家正确的解

软考之软件设计师考试总结(内附资料)

今年5月27日参加的软考,虽然研究生专业已经和计算机无缘了,但是只要想学,就没有什么能够阻挡。参加软考的初衷只是因为,,,辽宁省软考它不要钱,不要钱的证书咱不白嫖一个说不过去,先考下来再说这个证有没有用吧。确定报考后,再从网上找考试资料,忘记从哪里找的资料了反正资料有讲解视频和历年真题,感觉特别有用(分享网盘资料也不知

【ELFK】之消息队列kafka

一、kafka的定义Kafka是一个分布式的基于发布/订阅模式的消息队列(MQ,MessageQueue),主要应用于大数据实时处理领域。Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replicar协调的分布式消息中间件系统,它的最大的特性就是可以实时的处理大量

http-server的安装、前端使用http-server启本地服务

http-server简介http-server是一个简单的零配置的命令行http服务器,它足够强大便于生产和使用,用于本地测试和开发。有时候我们打开一个文档使用file协议打开的时候,不能发送ajax请求,只能使用http协议才能请求资源,具体的区别大家可以去参考[这篇文档](www.cnblogs.com/lish

Vue中的侦听器 Watch

侦听器Watch:::warning注意阅读本章内容之前必须先了解什么是计算属性Computed。相比计算属性,计算属性更适合用来做一些数据加工、过滤等处理。而侦听器更适合用来监听一个数据是否发生变化(包含data、props、computed),如果发生变化则触发特定的函数操作。定义Watch侦听器函数时,请不要使用

热文推荐