Files
envi-code/SourceCode/Code2026/AecRxBase/jsonRead.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

217 lines
5.0 KiB
C++

#include "StdAfx.h"
#include "shJson.h"
#include "Base64.h"
using namespace SHJson;
namespace
{
long getFileSize(FILE *fp)
{
if (!fp) return 0L;
fseek(fp, 0L, SEEK_END);
long fSize = ftell(fp);
fseek(fp, 0L, 0L);
return fSize;
}
}
namespace SHJson
{
WDocument::AllocatorType &SHJson::getJsonAllocator()
{
static WDocument g_doc;
return g_doc.GetAllocator();
}
std::wstring write2Json(const WValue &v, bool pretty)
{
WStringBuffer buffer;
if (pretty)
{
PrettyWriter<WStringBuffer, UTF16<>, UTF16<>> writer(buffer);
v.Accept(writer);
}
else
{
Writer<WStringBuffer, UTF16<>, UTF16<>> writer(buffer);
v.Accept(writer);
}
return buffer.GetString();
}
WDocument& string2Json(LPCTSTR json, WDocument &doc)
{
doc.Parse(json);
if (doc.HasParseError())
{
static WDocument docTmp;
return docTmp;
}
return doc;
}
bool json2File(LPCTSTR path, const WValue &v, bool pretty)
{
if (!path) return false;
std::wstring ws = write2Json(v, pretty);
if (ws.empty()) return false;
std::string s = Base64::unicode2Ansii(ws.c_str(), CP_UTF8);
CFile f;
CFileException e;
if (!f.Open(path, CFile::modeCreate | CFile::modeReadWrite, &e))
{
CString buffer;
e.GetErrorMessage(buffer.GetBuffer(1024), 1024);
AfxMessageBox(buffer);
buffer.ReleaseBuffer();
return false;
}
f.Write((char *)s.c_str(), sizeof(char) * s.size());
f.Close();
return true;
}
bool file2Json(LPCTSTR pszJson, WDocument &doc)
{
bool brel(false);
if (!pszJson) return false;
if (_taccess(pszJson, 0x0) != 0x0) return false;
FILE *fp(NULL);
char *readBuffer(NULL);
do
{
fp = _tfopen(pszJson, _T("rb"));
if (!fp) break;
long fSize = getFileSize(fp);
++fSize;
readBuffer = new char[fSize];
::memset(readBuffer, 0, sizeof(char) * (fSize));
FileReadStream bis(fp, readBuffer, fSize);
AutoUTFInputStream<unsigned, FileReadStream> eis(bis);
doc.ParseStream<0, AutoUTF<unsigned> >(eis);
if (readBuffer) delete[] readBuffer;
if (fp) fclose(fp);
return !doc.HasParseError();
} while (false);
return false;
}
WValue& addMember(WValue &v, LPCTSTR name, WValue &value)
{
if (!name)
{
static WValue vTmp;
return vTmp;
}
if (!v.IsObject()) v.SetObject();
MIt it = v.FindMember(name);
if (it != v.MemberEnd())
{
it->value.Swap(value);
}
else
{
WValue vName;
vName.SetString(name, getJsonAllocator());
v.AddMember(vName, value, getJsonAllocator());
}
return v;
}
WValue &addMember(WValue &v, LPCTSTR name, const int &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, const bool &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, const unsigned &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, const __int64 &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, const unsigned __int64 &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, const double &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, const float &value) { return addMember(v, name, WValue(value)); }
WValue &addMember(WValue &v, LPCTSTR name, LPCTSTR value)
{
WValue vv;
vv.SetString(value, getJsonAllocator());
return addMember(v, name, vv);
}
WValue &pushBack(WValue &arr, WValue &value)
{
if (!arr.IsArray()) arr.SetArray();
arr.PushBack(value, getJsonAllocator());
return arr;
}
WValue &pushBack(WValue &arr, const int &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, const unsigned &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, const __int64 &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, const unsigned __int64 &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, const bool &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, const double &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, const float &value) { return pushBack(arr, WValue(value)); }
WValue &pushBack(WValue &arr, LPCTSTR value) { return pushBack(arr, WValue(StringRef(value))); }
#pragma region LiteJosn
SimpleRead::SimpleRead(LPCTSTR pszJson): _v(_doc), _err(eSuccess)
{
SHJson::string2Json(pszJson, _doc);
if (_doc.HasParseError())
_err = eParseError;
}
SimpleRead& SimpleRead::operator[](LPCTSTR key) const
{
if (!_v.IsObject())
_err = eNotObject;
if (!_v.HasMember(key))
_err = eNoMember;
if (_err == eSuccess)
return SimpleRead(_v[key]);
else
return SimpleRead(_err);
}
SimpleRead& SimpleRead::operator[](int idx) const
{
if (!_v.IsArray())
_err = eNotArray;
if (idx < 0 || idx >= !_v.Size())
_err = eArrayOver;
if (_err == eSuccess)
return SimpleRead(_v[idx]);
else
return SimpleRead(_err);
}
#pragma endregion
}