JsonUtil.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright 2024 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "Common/JsonUtil.h"
  4. #include <fstream>
  5. #include "Common/FileUtil.h"
  6. picojson::object ToJsonObject(const Common::Vec3& vec)
  7. {
  8. picojson::object obj;
  9. obj.emplace("x", vec.x);
  10. obj.emplace("y", vec.y);
  11. obj.emplace("z", vec.z);
  12. return obj;
  13. }
  14. void FromJson(const picojson::object& obj, Common::Vec3& vec)
  15. {
  16. vec.x = ReadNumericFromJson<float>(obj, "x").value_or(0.0f);
  17. vec.y = ReadNumericFromJson<float>(obj, "y").value_or(0.0f);
  18. vec.z = ReadNumericFromJson<float>(obj, "z").value_or(0.0f);
  19. }
  20. std::optional<std::string> ReadStringFromJson(const picojson::object& obj, const std::string& key)
  21. {
  22. const auto it = obj.find(key);
  23. if (it == obj.end())
  24. return std::nullopt;
  25. if (!it->second.is<std::string>())
  26. return std::nullopt;
  27. return it->second.to_str();
  28. }
  29. std::optional<bool> ReadBoolFromJson(const picojson::object& obj, const std::string& key)
  30. {
  31. const auto it = obj.find(key);
  32. if (it == obj.end())
  33. return std::nullopt;
  34. if (!it->second.is<bool>())
  35. return std::nullopt;
  36. return it->second.get<bool>();
  37. }
  38. bool JsonToFile(const std::string& filename, const picojson::value& root, bool prettify)
  39. {
  40. std::ofstream json_stream;
  41. File::OpenFStream(json_stream, filename, std::ios_base::out);
  42. if (!json_stream.is_open())
  43. {
  44. return false;
  45. }
  46. json_stream << root.serialize(prettify);
  47. return true;
  48. }
  49. bool JsonFromFile(const std::string& filename, picojson::value* root, std::string* error)
  50. {
  51. std::string json_data;
  52. if (!File::ReadFileToString(filename, json_data))
  53. {
  54. return false;
  55. }
  56. *error = picojson::parse(*root, json_data);
  57. return error->empty();
  58. }