safeget

从数据库中取数据时,常会遇到字段值为空的现象,但在程序中往往需要确定的值,如果不希望程序报异常,则应使用safeget的方法,即,对空值进行判断,并用默认值代替之。

``` // 创建辅助函数用于安全获取JSON值 template<typename T> void SafeGet(const Json::Value& parent, const char* key, T& output) { if (parent.isMember(key)) output = parent[key].asString(); } struct tagMTFTesterResultAverage { string strFinal; string strSymmetricalGroupMTFExtrems; string strSymmetricalFielldMTFAverageExtrems; string strMTFAverageOfAllCameras; string strFieldPositionOfMTFAverage; string strFieldShiftSingleAverage; string strFocalShiftGroup; string strFocalShiftAverage; string strPeakRangeExtrems; string strPeakMTFExtrems; string strPeakMTFAverage; string strMTFRatioOfExtremsToMax; void FromJson(const Json::Value& json) { SafeGet(json, "Final", strFinal); SafeGet(json, "SymmetricalGroupMTFExtrems", strSymmetricalGroupMTFExtrems); SafeGet(json, "SymmetricalFielldMTFAverageExtrems", strSymmetricalFielldMTFAverageExtrems); SafeGet(json, "MTFAverageOfAllCameras", strMTFAverageOfAllCameras); SafeGet(json, "FieldPositionOfMTFAverage", strFieldPositionOfMTFAverage); SafeGet(json, "FieldShiftSingleAverage", strFieldShiftSingleAverage); SafeGet(json, "FocalShiftGroup", strFocalShiftGroup); SafeGet(json, "FocalShiftAverage", strFocalShiftAverage); SafeGet(json, "PeakRangeExtrems", strPeakRangeExtrems); SafeGet(json, "PeakMTFExtrems", strPeakMTFExtrems); SafeGet(json, "PeakMTFAverage", strPeakMTFAverage); SafeGet(json, "MTFRatioOfExtremsToMax", strMTFRatioOfExtremsToMax); } }; struct tagMTFTesterResult { string strFinal; // 最终结果 string strMTF; // MTF结果 string strDOF; // DOF结果 string strFocalShift; // 场曲结果 string strAstigmatism; // 像散结果 string strFOV; // FOV结果 tagMTFTesterResultAverage m_Average; // 均值管控测试结果 string strAggregate; // 综合结果 string strMultiFrqMTF; // 辅助频率结果 string strFail_Reason; // 失败原因 bool ParseFromJson(const Json::Value& json) { SafeGet(json, "Final", strFinal); SafeGet(json, "MTF", strMTF); SafeGet(json, "DOF", strDOF); SafeGet(json, "FocalShift", strFocalShift); SafeGet(json, "Astigmatism", strAstigmatism); SafeGet(json, "FOV", strFOV); //SafeGet(json, "Average", m_Average); Json::Value root; auto Result = root["Result"]; if (Result.isObject()) { m_Average.FromJson(Result["Average"]); } SafeGet(json, "Aggregate", strAggregate); SafeGet(json, "MultiFrqMTF", strMultiFrqMTF); SafeGet(json, "Fail_Reason", strFail_Reason); return true; } }; bool CSocketClientTester::ReadJson(string strJson, tagMTFTesterResult& result) { Json::Value root; JSONCPP_STRING errs; Json::CharReaderBuilder builder; std::istringstream jsonStream(strJson); if (!Json::parseFromStream(builder, jsonStream, &root, &errs)) { AfxMessageBox(_T("解析失败: ") + CString(errs.c_str())); return false; } Json::Value Result = root["Result"]; result.ParseFromJson(Result); return true; }```代码优化
03-21
``` struct tagMTFTesterResultAverage { string strFinal; string strSymmetricalGroupMTFExtrems; string strSymmetricalFielldMTFAverageExtrems; string strMTFAverageOfAllCameras; string strFieldPositionOfMTFAverage; string strFieldShiftSingleAverage; string strFocalShiftGroup; string strFocalShiftAverage; string strPeakRangeExtrems; string strPeakMTFExtrems; string strPeakMTFAverage; string strMTFRatioOfExtremsToMax; QVariantMap }; struct tagMTFTesterResult { string strFinal; // 最终结果 string strMTF; // MTF结果 string strDOF; // DOF结果 string strFocalShift; // 场曲结果 string strAstigmatism; // 像散结果 string strFOV; // FOV结果 tagMTFTesterResultAverage m_Average; // 均值管控测试结果 string strAggregate; // 综合结果 string strMultiFrqMTF; // 辅助频率结果 string strFail_Reason; // 失败原因 }; // 安全获取字段的模板函数 template<typename T> inline T safeGet(const json& j, const char* key, T defaultValue = T()) { return j.contains(key) ? j[key].get<T>() : defaultValue; } inline bool deserializeFromJSON(const std::string& jsonStr, tagMTFTesterResult& out, string& strError) { try { auto j = json::parse(jsonStr); // 解析第一层 out.strFinal = safeGet<std::string>(j["Result"], "Final", ""); out.strMTF = safeGet<std::string>(j["Result"], "MTF", ""); out.strDOF = safeGet<std::string>(j["Result"], "DOF", ""); out.strFocalShift = safeGet<std::string>(j["Result"], "FocalShift", ""); out.strAstigmatism = safeGet<std::string>(j["Result"], "Astigmatism", ""); out.strFOV = safeGet<std::string>(j["Result"], "FOV", ""); out.strFOV = safeGet<std::string>(j["Result"], "FOV", ""); // 解析嵌套的Average对象 const auto& avg = j["Result"]["Average"]; out.m_Average.strFinal = safeGet<std::string>(avg, "Final", ""); out.m_Average.strSymmetricalGroupMTFExtrems = safeGet<std::string>(avg, "SymmetricalGroupMTFExtrems", ""); out.m_Average.strSymmetricalFielldMTFAverageExtrems = safeGet<std::string>(avg, "SymmetricalFielldMTFAverageExtrems", ""); out.m_Average.strMTFAverageOfAllCameras = safeGet<std::string>(avg, "MTFAverageOfAllCameras", ""); out.m_Average.strFieldPositionOfMTFAverage = safeGet<std::string>(avg, "FieldPositionOfMTFAverage", ""); out.m_Average.strFieldShiftSingleAverage = safeGet<std::string>(avg, "FieldShiftSingleAverage", ""); out.m_Average.strFocalShiftGroup = safeGet<std::string>(avg, "FocalShiftGroup", ""); out.m_Average.strFocalShiftAverage = safeGet<std::string>(avg, "FocalShiftAverage", ""); out.m_Average.strPeakRangeExtrems = safeGet<std::string>(avg, "PeakRangeExtrems", ""); out.m_Average.strPeakMTFExtrems = safeGet<std::string>(avg, "PeakMTFExtrems", ""); out.m_Average.strPeakMTFAverage = safeGet<std::string>(avg, "PeakMTFAverage", ""); out.m_Average.strMTFRatioOfExtremsToMax = safeGet<std::string>(avg, "MTFRatioOfExtremsToMax", ""); // 其他字段按相同模式解析... out.strAggregate = safeGet<std::string>(j["Result"], "Aggregate", ""); out.strMultiFrqMTF = safeGet<std::string>(j["Result"], "MultiFrqMTF", ""); out.strFail_Reason = safeGet<std::string>(j["Result"], "strFail Reason", ""); return true; } catch (const json::exception& e) { // 处理解析错误 //std::cerr << << e.what() << std::endl; strError = "JSON解析错误: "; strError += e.what(); return false; } }```映射的结构体的词条和json字符串种的key不一样,没有带str
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值