json_value_output.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "json_value_output.h"
  2. #include <library/cpp/json/json_reader.h>
  3. namespace NProtobufJson {
  4. template <typename T>
  5. void TJsonValueOutput::WriteImpl(const T& t) {
  6. Y_ASSERT(Context.top().Type == TContext::JSON_ARRAY || Context.top().Type == TContext::JSON_AFTER_KEY);
  7. if (Context.top().Type == TContext::JSON_AFTER_KEY) {
  8. Context.top().Value = t;
  9. Context.pop();
  10. } else {
  11. Context.top().Value.AppendValue(t);
  12. }
  13. }
  14. void TJsonValueOutput::DoWrite(const TStringBuf& s) {
  15. WriteImpl(s);
  16. }
  17. void TJsonValueOutput::DoWrite(const TString& s) {
  18. WriteImpl(s);
  19. }
  20. void TJsonValueOutput::DoWrite(int i) {
  21. WriteImpl(i);
  22. }
  23. void TJsonValueOutput::DoWrite(unsigned int i) {
  24. WriteImpl(i);
  25. }
  26. void TJsonValueOutput::DoWrite(long long i) {
  27. WriteImpl(i);
  28. }
  29. void TJsonValueOutput::DoWrite(unsigned long long i) {
  30. WriteImpl(i);
  31. }
  32. void TJsonValueOutput::DoWrite(float f) {
  33. WriteImpl(f);
  34. }
  35. void TJsonValueOutput::DoWrite(double f) {
  36. WriteImpl(f);
  37. }
  38. void TJsonValueOutput::DoWrite(bool b) {
  39. WriteImpl(b);
  40. }
  41. void TJsonValueOutput::DoWriteNull() {
  42. WriteImpl(NJson::JSON_NULL);
  43. }
  44. void TJsonValueOutput::DoBeginList() {
  45. Y_ASSERT(Context.top().Type == TContext::JSON_ARRAY || Context.top().Type == TContext::JSON_AFTER_KEY);
  46. if (Context.top().Type == TContext::JSON_AFTER_KEY) {
  47. Context.top().Type = TContext::JSON_ARRAY;
  48. Context.top().Value.SetType(NJson::JSON_ARRAY);
  49. } else {
  50. Context.emplace(TContext::JSON_ARRAY, Context.top().Value.AppendValue(NJson::JSON_ARRAY));
  51. }
  52. }
  53. void TJsonValueOutput::DoEndList() {
  54. Y_ASSERT(Context.top().Type == TContext::JSON_ARRAY);
  55. Context.pop();
  56. }
  57. void TJsonValueOutput::DoBeginObject() {
  58. Y_ASSERT(Context.top().Type == TContext::JSON_ARRAY || Context.top().Type == TContext::JSON_AFTER_KEY);
  59. if (Context.top().Type == TContext::JSON_AFTER_KEY) {
  60. Context.top().Type = TContext::JSON_MAP;
  61. Context.top().Value.SetType(NJson::JSON_MAP);
  62. } else {
  63. Context.emplace(TContext::JSON_MAP, Context.top().Value.AppendValue(NJson::JSON_MAP));
  64. }
  65. }
  66. void TJsonValueOutput::DoWriteKey(const TStringBuf& key) {
  67. Y_ASSERT(Context.top().Type == TContext::JSON_MAP);
  68. Context.emplace(TContext::JSON_AFTER_KEY, Context.top().Value[key]);
  69. }
  70. void TJsonValueOutput::DoEndObject() {
  71. Y_ASSERT(Context.top().Type == TContext::JSON_MAP);
  72. Context.pop();
  73. }
  74. void TJsonValueOutput::DoWriteRawJson(const TStringBuf& str) {
  75. Y_ASSERT(Context.top().Type == TContext::JSON_ARRAY || Context.top().Type == TContext::JSON_AFTER_KEY);
  76. if (Context.top().Type == TContext::JSON_AFTER_KEY) {
  77. NJson::ReadJsonTree(str, &Context.top().Value);
  78. Context.pop();
  79. } else {
  80. NJson::ReadJsonTree(str, &Context.top().Value.AppendValue(NJson::JSON_UNDEFINED));
  81. }
  82. }
  83. }