jsonutils.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "StdInc.h"
  2. #include "jsonutils.h"
  3. static QVariantMap JsonToMap(const JsonMap & json)
  4. {
  5. QVariantMap map;
  6. for (auto & entry : json)
  7. {
  8. map.insert(QString::fromUtf8(entry.first.c_str()), JsonUtils::toVariant(entry.second));
  9. }
  10. return map;
  11. }
  12. static QVariantList JsonToList(const JsonVector & json)
  13. {
  14. QVariantList list;
  15. for (auto & entry : json)
  16. {
  17. list.push_back(JsonUtils::toVariant(entry));
  18. }
  19. return list;
  20. }
  21. static JsonVector VariantToList(QVariantList variant)
  22. {
  23. JsonVector vector;
  24. for (auto & entry : variant)
  25. {
  26. vector.push_back(JsonUtils::toJson(entry));
  27. }
  28. return vector;
  29. }
  30. static JsonMap VariantToMap(QVariantMap variant)
  31. {
  32. JsonMap map;
  33. for (auto & entry : variant.toStdMap())
  34. {
  35. map[entry.first.toUtf8().data()] = JsonUtils::toJson(entry.second);
  36. }
  37. return map;
  38. }
  39. namespace JsonUtils
  40. {
  41. QVariant toVariant(const JsonNode & node)
  42. {
  43. switch (node.getType())
  44. {
  45. break; case JsonNode::DATA_NULL: return QVariant();
  46. break; case JsonNode::DATA_BOOL: return QVariant(node.Bool());
  47. break; case JsonNode::DATA_FLOAT: return QVariant(node.Float());
  48. break; case JsonNode::DATA_STRING: return QVariant(QString::fromUtf8(node.String().c_str()));
  49. break; case JsonNode::DATA_VECTOR: return JsonToList(node.Vector());
  50. break; case JsonNode::DATA_STRUCT: return JsonToMap(node.Struct());
  51. }
  52. return QVariant();
  53. }
  54. QVariant JsonFromFile(QString filename)
  55. {
  56. QFile file(filename);
  57. file.open(QFile::ReadOnly);
  58. auto data = file.readAll();
  59. JsonNode node(data.data(), data.size());
  60. return toVariant(node);
  61. }
  62. JsonNode toJson(QVariant object)
  63. {
  64. JsonNode ret;
  65. if (object.canConvert<QVariantMap>())
  66. ret.Struct() = VariantToMap(object.toMap());
  67. if (object.canConvert<QVariantList>())
  68. ret.Vector() = VariantToList(object.toList());
  69. if (object.canConvert<QString>())
  70. ret.String() = object.toString().toUtf8().data();
  71. if (object.canConvert<double>())
  72. ret.Bool() = object.toFloat();
  73. if (object.canConvert<bool>())
  74. ret.Bool() = object.toBool();
  75. return ret;
  76. }
  77. void JsonToFile(QString filename, QVariant object)
  78. {
  79. std::ofstream file(filename.toUtf8().data(), std::ofstream::binary);
  80. file << toJson(object);
  81. }
  82. }