void WorkspaceSerializer::Write(const QString& fileName, const SignalData& data, const PlotInfo& plotInfo, bool writeValues /*= true*/) { QJsonObject json; json["background"] = plotInfo.getBackgroundColor().name(); if (writeValues) { if (auto domain = data.getDomain()) json["domain"] = domain->name; } QJsonArray signArray; data.onSignals([&](const Signal& signal){ QJsonObject signObj; signObj["name"] = signal.name; signObj["color"] = signal.graphic.color.name(); signObj["visible"] = signal.graphic.visible; signObj["range"] = ToJsonArray(QVector < qreal > {signal.graphic.rangeLower, signal.graphic.rangeUpper}); if (writeValues) signObj["values"] = ToJsonArray(signal.y); signObj["ticks"] = ToJsonArray(signal.graphic.ticks); signObj["tickLabels"] = ToJsonArray(signal.graphic.tickLabels); signArray.push_back(std::move(signObj)); }); json["signals"] = signArray; QJsonDocument saveDoc(json); QFile outF(fileName); outF.open(QIODevice::WriteOnly); outF.write(saveDoc.toJson(QJsonDocument::Indented)); }
int ToJsonObj(const Message& message, Json::Value& value) { const Reflection* pReflection = message.GetReflection(); const FieldDescriptor* pFieldDescriptor = NULL; bool bRepeated = false; std::vector<const FieldDescriptor*> fields; pReflection->ListFields(message, &fields); int ret = 0; for (size_t i = 0; i < fields.size(); i++) { pFieldDescriptor = fields[i]; bRepeated = pFieldDescriptor->is_repeated(); string name_str = pFieldDescriptor->name(); map<string, string> key_map; if (bRepeated) { ret += ToJsonArray(message, pFieldDescriptor, value, name_str, key_map); continue; } ret += ToJson(message, pFieldDescriptor, value, name_str, key_map); } return ret; }
int ToJsonObjMap(const Message& message, Json::Value& value, map<string, string>& key_map) { const Reflection* pReflection = message.GetReflection(); const FieldDescriptor* pFieldDescriptor = NULL; bool bRepeated = false; std::vector<const FieldDescriptor*> fields; pReflection->ListFields(message, &fields); int ret = 0; for (size_t i = 0; i < fields.size(); i++) { pFieldDescriptor = fields[i]; bRepeated = pFieldDescriptor->is_repeated(); string name_str = pFieldDescriptor->containing_type()->name() + "." + pFieldDescriptor->name(); map<string, string>::iterator it = key_map.find(name_str); if (it != key_map.end()) { name_str = it->second; } else { name_str = pFieldDescriptor->name(); } if (bRepeated) { ret += ToJsonArray(message, pFieldDescriptor, value, name_str, key_map); continue; } ret += ToJson(message, pFieldDescriptor, value, name_str, key_map); } return ret; }