前言
通过jsoncpp库,解析json文件转换为自定义的结构。在内存中操作完成后,将结构转换为json串。在某些场景可能存在一些问题,欢迎指正,共同进步。
#include <iostream>
#include <json/json.h>
#include <map>
#include <string>
#include <list>
#include <memory>
#include <fstream>
#include <vector>
/**
* Json::Value 对象如果是作为一个数组添加给父对象时,通过父对象的 Json::Value::append()或者Json::Value 对象数字索引下标添加。
* Json::Value 对象如果是作为一个对象添加给父对象时,通过对象的字符串下标添加。
*/
struct JsonDoc
{
JsonDoc()
{
}
~JsonDoc()
{
clear(m_nodeChild);
}
void clear(std::list<JsonDoc*>& nodes)
{
if(nodes.empty())
return;
for(std::list<JsonDoc*>::iterator it = nodes.begin(); it != nodes.end(); )
{
clear((*it)->m_nodeChild);
JsonDoc* del = (*it);
nodes.erase(it++);
delete (del);
}
}
public:
typedef std::vector<std::pair<std::string,std::string>> VecPair;
VecPair m_mapAttr;
std::string m_sHeadName;
std::list<JsonDoc*> m_nodeChild;
JsonDoc* m_parent;
bool m_isArray;
bool m_isObject;
};
typedef std::shared_ptr<JsonDoc> JsonDocPtr;
class WRJSON
{
public:
static JsonDocPtr readDataFromFile(const std::string& fileName)
{
JsonDocPtr doc = std::make_shared<JsonDoc>();
std::ifstream ifs;
ifs.open(fileName);
if(ifs.is_open())
{
Json::Reader reader;
Json::Value root;
if(reader.parse(ifs,root,false))
{
JsonDoc* pDoc = doc.get();
pDoc->m_sHeadName = "root";
readData(pDoc,root);
}
}
return doc;
}
static bool writeDataToFile(const std::string& fileName, JsonDocPtr& doc)
{
JsonDoc* pDoc = doc.get();
if(!pDoc)
return false;
Json::Value root;
Json::FastWriter writer;
writeDate(pDoc,root);
std::cout << " res:\n" << writer.write(root) << std::endl;
return true;
}
private:
static void readData(JsonDoc* node, Json::Value& root)
{
for(auto it = root.begin(); it != root.end(); ++it)
{
if(it->isArray())
{
JsonDoc* child = new JsonDoc;
child->m_parent = node;
node->m_nodeChild.push_back( child);
child->m_sHeadName = it.name();
child->m_isArray = it->isArray();
readData(child,*it);
}
else if(it->isObject())
{
JsonDoc* child = new JsonDoc;
child->m_parent = node;
node->m_nodeChild.push_back(child);
child->m_sHeadName = it.name();
child->m_isObject = it->isObject();
readData(child,*it);
}
else
{
// node->m_mapAttr[it.name()] = it->asString();
node->m_mapAttr.push_back(std::make_pair(it.name(),it->asString()));
}
// std::cout << "mem name : " << it.memberName() << " name : " << it.name() << std::endl;
}
}
static void writeDate(JsonDoc* node, Json::Value& root)
{
if(!node)
return;
// 属性
JsonDoc::VecPair::iterator iter = node->m_mapAttr.begin();
for(; iter != node->m_mapAttr.end(); ++iter)
{
if(iter->first.empty())
{
root.append(iter->second);
}
else
{
root[iter->first] = iter->second ;
}
}
// 子节点
for(JsonDoc*& child : node->m_nodeChild)
{
Json::Value person;
// if(child->m_isArray)
// {
// writeDate(child, person);
// }
// else if(child->m_isObject)
// {
// writeDate(child, person);
// }
writeDate(child, person);
if(child->m_sHeadName.empty())
root.append(person);
else
root[child->m_sHeadName] = person;
}
}
};
int main()
{
JsonDocPtr jsonDoc = WRJSON::readDataFromFile("/home/guoqr/ShareFile/obj.json");
JsonDoc* doc = jsonDoc.get();
{
WRJSON::writeDataToFile("/home/guoqr/test.json", jsonDoc);
}
std::cout << "-----------------" << std::endl;
return 0;
}