c++ nlohmann/json e modifique palavras-chave individuais no arquivo json

(2 mensagens) nlohmann json usa _nlohmann::json_ Snail One-way Blog - CSDN Blog json é notação de objeto JavaScript é um formato de dados que substitui gradualmente o xml tradicional. Nomes de atributos e valores de string no formato de dados JSON precisam ser colocados entre aspas duplas. Usar aspas simples ou não usar aspas causará erros na leitura dos dados. Outro formato de dados do json é um array, que é igual ao literal do array em javascript.

Usar o formato e análise do Json é conveniente, você pode representar informações de um objeto. Json tem dois formatos:

Não pode haver comentários ou indefinidos em json. Desde que haja strings envolvidas, são necessárias aspas duplas.

①Formato do objeto: {"key1":obj,"key2":obj,"key3":obj...},

②Formato da matriz/conjunto: [obj, obj, obj...].

json.parse() analisa a string no valor correspondente,

exemplo:

nlohmann /json: JSON para C++ moderno (github.com)

 Baixe o código e adicione a pasta include ao caminho de inclusão do projeto de teste :

Usei o caminho absoluto: D:\excer\mfc\json\json\include\; 

 Código de teste:

#include <iostream>
#include <fstream>
#include <ostream>
#include "json.hpp"
using json = nlohmann::json;

int main()
{
    std::cout << "Hello World!\n";

	//读取json文件--------------------------------
	std::ifstream f("example.json");
	json data = json::parse(f);
	double pi = data["pi"];
	bool td = false; 
	//td = data["happy"];
	if (!data["happy"].is_null())
	{
		td = data["happy"];
	}
	std::string sname = data["name"].get<std::string>(); ;
	std::cout << data;
	int c = 0;

	//输出json文件--------------------------------
	// create an empty structure (null)
	json j;

    //方式一---------------------------------------
	// add a number that is stored as double (note the implicit conversion of j to an object)
	j["pi"] = 3.141;

	// add a Boolean that is stored as bool
	j["happy"] = true;

	// add a string that is stored as std::string
	j["name"] = "Niels";

	// add another null object by passing nullptr
	j["nothing"] = nullptr;

	// add an object inside the object
	j["answer"]["everything"] = 42;

	// add an array that is stored as std::vector (using an initializer list)
	j["list"] = { 1, 0, 2 };

	// add another object (using an initializer list of pairs)
	j["object"] = { {"currency", "USD"}, {"value", 42.99} };

    //方式二---------------------------------------
	// instead, you could also write (which looks very similar to the JSON above)
	json j2 = {
	  {"pi", 3.141},
	  {"happy", true},
	  {"name", "Niels"},
	  {"nothing", nullptr},
	  {"answer", {
		{"everything", 42}
	  }},
	  {"list", {1, 0, 2}},
	  {"object", {
		{"currency", "USD"},
		{"value", 42.99}
	  }}
	};

	//输出到文件中
	std::ofstream fout("out.json");
	fout << std::setw(4)<< j;
	fout << std::setw(4) << j2;
	fout.close();

}

Correspondente: formato json

{
  "pi": 3.141,
  "happy": true,
  "name": "Niels",
  "nothing": null,
  "answer": {
    "everything": 42
  },
  "list": [1, 0, 2],
  "object": {
    "currency": "USD",
    "value": 42.99
  }
}

 Manipulação de exceção:

O rótulo (palavra-chave) happy2 não existe, apenas o rótulo (palavra-chave) happy. Se a instrução bool td = data["happy2"]; for executada e o rótulo happy2 for lido diretamente, o analisador irá travar.

Solução : Primeiro verifique se a tag está vazia. Se estiver vazia, não leia diretamente. Somente quando a tag não estiver vazia ela poderá ser lida diretamente.

//td = data["happy"];
	if (!data["happy"].is_null())//关键字不为空才能直接读取
	{
		td = data["happy"];
	}

Ou use conter

if (js.contains("exposure"))
	{
		// expos = js["exposure"];//不建议
		//.get<std::string>()
		expos = js["exposure"].get<int>();//建议显示类型转换
		strTemp.Format(L"%d", expos);
		SetDlgItemText(IDC1_EDIT1, strTemp);;
	}

 

 Exceção 2: ao modificar palavras-chave individuais no arquivo json

Modifique diretamente js["exposure"] = expos; ao gravar em um arquivo json, palavras-chave repetidas aparecerão no arquivo e o json travará ao ler e analisar o arquivo posteriormente. A solução é: leia o arquivo json primeiro e depois analisá-lo.Após a análise, atribua o valor à variável intermediária.

Basta modificar as palavras-chave nas variáveis ​​intermediárias e salvar o arquivo json.

std::ifstream ifs("config.json", std::ios::app);//先读json文件
	json ss = json::parse(ifs);//解析json文件
	json js = ss;//中间变量js
	//js = ss;
	CString strTemp;
	GetDlgItemText(IDC1_EDIT1, strTemp);
	int expos = _ttoi(strTemp);
	if (js.contains("exposure"))
	{
		js["exposure"] = expos;//修改中间变量js中关键字exposure
	}
	

	std::ofstream fs("config.json");//最后写json文件
	fs << std::setw(4)<< js << std::endl;;//setw(4) 是用于打印格式好看的 json 文件//使用 j.dump(4) 也是一样的效果
	//fs <<  js;
	fs.close();

referência:

Problemas · nlohmann/json (github.com) https://github.com/nlohmann/json/issues/1475

Leia principalmente os seguintes artigos:

Escreva o formato json

Tutorial de uso básico de nlohmann json em linguagem c++_C_Script Home (jb51.net)

nlohmann/json: JSON para C++ moderno (github.com) https://github.com/nlohmann/json/tree/develop

Três formatos de JSON https://blog.csdn.net/daxiong0816/article/details/125132404

formato json (keoaeic.org) https://mip.keoaeic.org/unscramble_major/4394.html escrita em formato json C++_blog de Xue Xingtu-blog CSDN https://blog.csdn.net/weixin_45387966/article/details/122469835

(2 mensagens) nlohmann json usa _nlohmann::json_ Snail One-way Blog-CSDN Blog https://blog.csdn.net/qq_39568245/article/details/115312690?utm_medium=distribute.pc_relevant.none-task- blog-2 ~ padrão ~ baidujs_baidulandingword ~ ​​padrão-0-115312690-blog-121181848.235%5Ev38%5Epc_relevant_anti_vip_base&spm=1001.2101.3001.4242.1&utm_relevant_index=3

Acho que você gosta

Origin blog.csdn.net/u012719076/article/details/131167667
Recomendado
Clasificación