c++ nlohmann/json y modificar palabras clave individuales en el archivo json

(2 mensajes) nlohmann json usa _nlohmann::json_ Snail One-way Blog - CSDN Blog json es una notación de objetos JavaScript, es un formato de datos que reemplaza gradualmente al xml tradicional. Los nombres de atributos y valores de cadenas en formato de datos json deben estar entre comillas dobles. El uso de comillas simples o no comillas provocará errores al leer los datos. Otro formato de datos de json es una matriz, que es el mismo que el literal de matriz en javascript.

Es conveniente usar el formato y el análisis de Json, puede representar la información de un objeto. Json tiene dos formatos:

No puede haber comentarios ni indefinidos en json. Siempre que haya cadenas involucradas, se requieren comillas dobles.

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

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

json.parse() analiza la cadena en el valor correspondiente,

ejemplo:

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

 Descargue el código y luego agregue la carpeta de inclusión a la ruta de inclusión del proyecto de prueba :

Utilicé la ruta absoluta: D:\excer\mfc\json\json\include\; 

 Código de prueba:

#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();

}

Correspondiente: formato json

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

 Manejo de excepciones:

La etiqueta (palabra clave) happy2 no existe, solo la etiqueta (palabra clave) happy. Si se ejecuta la declaración bool td = data["happy2"]; y la etiqueta happy2 se lee directamente, el analizador fallará.

Solución : Primero verifique si la etiqueta está vacía, si está vacía no la lea directamente. Solo cuando la etiqueta no está vacía se puede leer directamente.

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

O usar contener

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

 

 Excepción 2: al modificar palabras clave individuales en el archivo json

Modifique directamente js ["exposición"] = expos; al escribir en un archivo json, aparecerán palabras clave repetidas en el archivo y json fallará al leer y analizar el archivo más tarde. La solución es: leer el archivo json primero y luego analizarlo Después del análisis, asigne el valor a la variable intermedia.

Simplemente modifique las palabras clave en las variables intermedias y luego guarde el archivo 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();

referencia:

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

Lea principalmente los siguientes artículos:

Escribir formato json

Tutorial de uso básico de nlohmann json en c++_C language_Script Home (jb51.net)

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

Tres formatos de JSON https://blog.csdn.net/daxiong0816/article/details/125132404

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

(2 mensajes) 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 ~predeterminado~baidujs_baidulandingword~default-0-115312690-blog-121181848.235%5Ev38%5Epc_relevant_anti_vip_base&spm=1001.2101.3001.4242.1&utm_relevant_index=3

Supongo que te gusta

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