str转wstr的三种方法和从网站获取json数据到数据随机提取,返回拼接字符串和动态数组

库的设置 hv库
外部包含目录:…\include\libhv_new\hv;
库目录:…\include\libhv_new\lib\x86\Release;
附加依赖项:hv.lib;

//Get请求 获取json数据,然后提取符合 条件的,time值大于自定义变量的值,然后取出来,再抽取自定义个数,比如3个,把name拼接返回,再把数据放进动态数组也返回,两种类型的返回!23-11-21

#include "requests.h"
#include <unordered_set> 
struct DataItem {
	int id;
	std::wstring name;
	bool isChange;
};
using Json = nlohmann::json;
std::vector<DataItem> dataItems;


struct ServerDataResult {
	std::wstring concatenatedNames;
	std::vector<DataItem> dataItems;
};
//--------------str 转 wstr 的三种方法 -----------------
std::wstring convertToWideString1(const std::string& str) {
	std::wstring wideStr(str.begin(), str.end());
	return wideStr;//构造函数 更简洁
}
std::wstring convertToWideString2(const std::string& str) {
	std::wstring wideStr;
	wideStr.resize(str.size(), L' ');
	std::copy(str.begin(), str.end(), wideStr.begin());
	return wideStr;
}
//-----------------第三种通用,但需要头文件--------------------------
#include <locale>
#include <codecvt>
/*
这种方法使用了 std::wstring_convert 类模板和 std::codecvt_utf8 类模板,它们提供了跨平台的支持,能够在不同的字符编码环境中进行字符串转换。
这里的示例使用了 UTF-8 编码,你可以根据需要选择其他字符编码,如 UTF-16 或 UTF-32。
这种方法的优点是它是标准库提供的通用解决方案,不依赖于特定的平台或编译器。它能够在不同的机器和代码之间保持一致,并且适用于大多数常见的字符编码方案。
*/
std::wstring convertToWideString3(const std::string& str) {
	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
	return converter.from_bytes(str);
}

std::string convertToNarrowString(const std::wstring& wstr) {
	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
	return converter.to_bytes(wstr);
}
//==========================================================================================



std::pair<std::wstring, std::vector<DataItem>> GetServerData(int numNamesToExtract, int times) {
	std::wstring concatenatedNames{};
	std::vector<DataItem> dataItems;
	printf("等待网站返回数据中.....\n");

	// 发起 HTTP 请求获取数据
	requests::Response resp = requests::get("http://124.222.37.232/api/list?ok=1");
	if (resp->status_code != 200) {
		printf("Request failed!\n");
		return std::make_pair(L"", dataItems);
	}

	// 解析返回的JSON
	Json json;
	try {
		json = Json::parse(resp->body);  // 使用 parse() 方法解析 JSON 字符串
	}
	catch (const nlohmann::json::parse_error& e) {
		printf("Failed to parse JSON: %s\n", e.what());
		return std::make_pair(L"", dataItems);
	}
	//===========打印所有数据======
	printf("Complete data:\n");
	printf("%s\n", json.dump().c_str());  // 打印全部网站获取的数据

	// 检查 JSON 数据中的字段
	if (json.is_object() && json.contains("total") && json["total"].is_number()) {
		int total = json["total"];
		printf("Total count: %d\n", total);

		if (json.contains("data") && json["data"].is_array()) {
			const nlohmann::json& dataArray = json["data"];
			srand(static_cast<unsigned int>(time(nullptr)));
			std::vector<const nlohmann::json*> filteredData;

			// 过滤符合条件的数据
			for (const nlohmann::json& item : dataArray) {
				if (item.is_object() && item.contains("name") && item["name"].is_string()
					&& item.contains("time") && item["time"].is_string()) {
					std::string time = item["time"].get<std::string>();
					int timeValue = std::stoi(time);
					if (timeValue < times) {
						filteredData.push_back(&item);
					}
				}
			}

			// 随机选择 numNamesToExtract 个名称
			std::vector<size_t> randomIndices;
			if (filteredData.size() <= static_cast<size_t>(numNamesToExtract)) {
				// 数据量不足 numNamesToExtract 个时,选择全部数据
				for (size_t i = 0; i < filteredData.size(); ++i) {
					randomIndices.push_back(i);
				}
			}
			else {
				// 数据量足够时,随机选择 numNamesToExtract 个索引
				std::unordered_set<size_t> selectedIndices;
				while (selectedIndices.size() < static_cast<size_t>(numNamesToExtract)) {
					size_t randomIndex = rand() % filteredData.size();
					selectedIndices.insert(randomIndex);
				}
				randomIndices.assign(selectedIndices.begin(), selectedIndices.end());
			}

			// 提取名称数据
			for (size_t index : randomIndices) {
				const nlohmann::json& item = *filteredData[index];
				std::string name = item["name"].get<std::string>();
				std::string time = item["time"].get<std::string>();
				std::wstring wideName = convertToWideString3(name);

				DataItem dataItem;
				dataItem.id = static_cast<int>(dataItems.size()) + 1;
				dataItem.name = wideName;
				dataItem.isChange = false;  // 默认设置为 false,因为无法比较之前的数据
				dataItems.push_back(dataItem);

				if (!concatenatedNames.empty()) {
					concatenatedNames += L",";
				}
				concatenatedNames += wideName;
				// 输出 "time" 字段的值进行调试
				printf("Time value: %s\n", time.c_str());
			}

			const wchar_t* tCharStr = concatenatedNames.c_str();
			printf("Concatenated names: %ls\n", tCharStr);
		}
	}
	else {
		printf("Failed to parse 'total' field!\n");
	}

	// 打印 dataItems 中的数据
	printf("DataItems:\n");
	for (const DataItem& item : dataItems) {
		printf("ID: %d, Name: %ls \n", item.id, item.name.c_str());
		// 打印其他字段的值
	}

	return std::make_pair(concatenatedNames, dataItems);
}

int main() {
	int numNamesToExtract = 3;
	int times = 50;

	std::pair<std::wstring, std::vector<DataItem>> result = GetServerData(numNamesToExtract, times);

	std::wstring concatenatedNames = result.first;
	std::vector<DataItem> dataItems = result.second;

	std::wcout << "Concatenated Names: " << concatenatedNames << std::endl;
	for (const auto& item : dataItems) {
		std::wcout << "ID: " << item.id << std::endl;
		std::wcout << "Name: " << item.name << std::endl;
		// 打印其他字段的值
		std::wcout << std::endl;
	}

	return 0;
}

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/178491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uview-plus u-picker的defaultIndexs修改后无效的问题

uniapp项目中使用了uview-plus组件库&#xff0c;在使用u-picker组件时&#xff0c;发现其默认的选中属性 defaultIndex是一次性的&#xff0c;修改后无法响应&#xff0c;解决办法就是在u-picker源码中修改这个属性的watch,源码位置在uni_modules/uview-plus/components/u-pi…

Uptime Kuma 企业微信群机器人告警

curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa \-H Content-Type: application/json \-d {"msgtype": "text","text": {"content": "hello world"}}企业微信群机器人ke…

[autojs]autojs开关按钮的简单使用

"ui"; ui.layout(<vertical><Switch id"autoService" text"无障碍服务"checked"false"textSize"15sp"/><button text"第二个按钮"/></vertical> ); ui.autoService.on("check"…

分享5款你值得拥有,十分好用的小众软件

​ 今天为大家推荐五款不常见但好用的win10软件&#xff0c;它们都有着各自的特色和优势&#xff0c;相信你会喜欢的。 1.图片处理——Darktable ​ Darktable是一款开源的摄影工作流程应用程序和原始图像开发者。它可以让你管理你的数码底片&#xff0c;通过一个可缩放的光台…

openEuler 22.03 制作openssh9.5p1rpm包

1、yum安装编译依赖的组件 yum install -y rpm-build gcc gcc-c glibc glibc-devel openssl-devel openssl pcre-devel zlib zlib-devel make wget krb5-devel pam-devel libX11-devel libXt-devel initscripts libXt-devel gtk2-devel lrzsz 虚拟机配置可参考本地yum源 2…

ESP32 碰上内存分配问题

1、背景 看图片 _calloc_r ->_malloc_r ->heap_caps_malloc_default->heap_caps_malloc->multi_heap_malloc->multi_heap_malloc_impl->get_next_block /* Return the next sequential block in the heap.*/ static inline heap_block_t *get_next_block(co…

Web前端—移动Web第四天(vw适配方案、vw和vh的基本使用、综合案例-酷我音乐)

版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第四天01-vw适配方案vw和vh基本使用vw布局vh布局混用问题 02-综合案例-酷我音乐准备工作头部布局头部内容搜索区域banner 区域标题公共样式排行榜内容推荐歌单布局推荐歌单内…

rsync配置和守护进程实践

目录 一、rsync概念 1.rsync简介 2.rsync特点 3、增量和全局传输 二、Rsync工作方式 1.准备好rsync备份服务器 2.本地的数据传输模式 3.远程的数据传输模式 4.rsync数据推拉模式 三、实践 1.准备三台虚拟机 2.都安装rsync服务 3.拉取远程文件 3.推送文件 4.rsyn…

使用云 SIEM 解决方案保护IT 基础设施

什么是云 SIEM 基于云的 SIEM 解决方案将 SIEM 功能作为服务提供&#xff0c;云 SIEM 解决方案可保护您的网络;提供威胁情报&#xff0c;提供用于检测、优先处理和解决安全事件的控制台&#xff0c;并帮助您遵守法规要求。云 SIEM 解决方案在管理本地和云环境的网络安全时提供…

java.lang.ArrayIndexOutOfBoundsException: (数组越界异常)

java.lang.ArrayIndexOutOfBoundsException: &#xff08;数组越界异常&#xff09; 如何解决数组越界异常&#xff1f;1.1条件判断1.2循环结构1.3 try-catch&#xff08;异常捕获&#xff09;避免数组越界异常的方法&#xff1a;数组越界异常的调试和排查技巧&#xff1a; 当我…

RAAGR2-Net:一种使用多个空间帧的并行处理的脑肿瘤分割网络

RAAGR2-Net: A brain tumor segmentation network using parallel processing of multiple spatial frames RAAGR2-Net&#xff1a;一种使用多个空间帧的并行处理的脑肿瘤分割网络背景贡献实验N4 bias-field-correction 数据预处理Z-score and re-sampling Z-score归一化&#…

给定一个非严格递增排列的有序数组,删除数组中的重复项

实例要求&#xff1a;1、给定一个非严格递增排列的有序数组 nums &#xff1b;2、原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff1b;3、返回删除后数组的新长度&#xff1b;4、元素的 相对顺序 应该保持 一致 &#xff1b;5、然后返回 nums 中唯一元素的…

C++一个关于delete的幼稚错误

分析 在项目开发中&#xff0c;遇上这么一个错误&#xff1a; 0xc00000fd stack_overflow 这是一个栈溢出的错误&#xff0c;奇怪&#xff0c;我delete怎么会提示这么一个错误呢&#xff1f; 与是问题了群&#xff1a; 总结 这个错误实在是蠢啊&#xff01; 没有细想&am…

含分布式电源的配电网可靠性评估(matlab代码)

1主要内容 该程序参考《基于仿射最小路法的含分布式电源配电网可靠性分析》文献方法&#xff0c;通过概率模型和时序模型分别进行建模&#xff0c;实现基于概率模型最小路法的含分布式电源配电网可靠性评估以及时序模型序贯蒙特卡洛模拟法的含分布式电源配电网可靠性评估。程序…

centos 安装k8s教程(一键安装k8s)

第一步 准备几台机器 第二步 K8s Manager 服务器中添加docker支持 安装教程请查看这个博客 docker 安装详细教程 点我 第三步安装 KuboardSpray 教程在这里 第四步 下载k8s资源包 第五步 安装k8s 点击安装后 显示如下&#xff1a;等待完成

年底了,我劝大家真别轻易离职...

年底了&#xff0c;一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的软件测试…

Web自动化测试流程:从入门到精通,帮你成为测试专家!

Web应用程序在今天的软件开发中占据着越来越重要的地位。保证Web应用程序的质量和稳定性是非常必要的&#xff0c;而自动化测试是一种有效的方法。本文将介绍Web自动化测试流程&#xff0c;并提供代码示例。 步骤一&#xff1a;选取测试工具 选择适合自己团队的自动化测试工具…

极限学习机

极限学习机&#xff08;ELM, Extreme Learning Machines&#xff09;是一种前馈神经网络&#xff0c;ELM 不需要基于梯度的反向传播来调整权重&#xff0c;而是通过 Moore-Penrose generalized inverse来设置权值。 标准的单隐藏层神经网络结构如下&#xff1a; 单隐藏层神经…

ETL-使用kettle批量复制sqlserver数据到mysql数据库

文章标题 1、安装sqlserver数据库2、下载kettle3、业务分析4、详细流程&#xff08;1&#xff09;转换1&#xff1a;获取sqlserver所有表格名字&#xff0c;将记录复制到结果&#xff08;2&#xff09;转换2&#xff1a;从结果设置变量&#xff08;3&#xff09;转换3&#xff…

unityplayer.dll如何安装?unityplayer.dll缺失的解决方法

Unityplayer.dll是Unity引擎所需的一个重要动态链接库&#xff08;DLL&#xff09;文件&#xff0c;负责在运行Unity创建的游戏或应用程序时处理相关的软件逻辑。如果此文件意外丢失&#xff0c;可能会导致错误提示&#xff0c;甚至阻止程序的正常运行。因此&#xff0c;对于许…