JsonArray.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright Benoit Blanchon 2014
  2. // MIT License
  3. //
  4. // Arduino JSON library
  5. // https://github.com/bblanchon/ArduinoJson
  6. #include "ArduinoJson/JsonArray.hpp"
  7. #include <new> // required for placement new
  8. #include "ArduinoJson/JsonBuffer.hpp"
  9. #include "ArduinoJson/JsonObject.hpp"
  10. #include "ArduinoJson/Internals/CompactJsonWriter.hpp"
  11. #include "ArduinoJson/Internals/PrettyJsonWriter.hpp"
  12. using namespace ArduinoJson;
  13. using namespace ArduinoJson::Internals;
  14. JsonArray JsonArray::_invalid(NULL);
  15. int JsonArray::size() const {
  16. int nodeCount = 0;
  17. for (JsonArrayNode *node = _firstNode; node; node = node->next) nodeCount++;
  18. return nodeCount;
  19. }
  20. JsonValue &JsonArray::at(int index) const {
  21. JsonArrayNode *node = _firstNode;
  22. while (node && index--) node = node->next;
  23. return node ? node->value : JsonValue::invalid();
  24. }
  25. JsonValue &JsonArray::add() {
  26. JsonArrayNode *node = createNode();
  27. if (!node) return JsonValue::invalid();
  28. addNode(node);
  29. return node->value;
  30. }
  31. JsonArrayNode *JsonArray::createNode() {
  32. if (!_buffer) return NULL;
  33. void *ptr = _buffer->alloc(sizeof(JsonArrayNode));
  34. return ptr ? new (ptr) JsonArrayNode() : NULL;
  35. }
  36. void JsonArray::addNode(JsonArrayNode *newNode) {
  37. if (_firstNode) {
  38. JsonArrayNode *lastNode = _firstNode;
  39. while (lastNode->next) lastNode = lastNode->next;
  40. lastNode->next = newNode;
  41. } else {
  42. _firstNode = newNode;
  43. }
  44. }
  45. JsonArray &JsonArray::createNestedArray() {
  46. if (!_buffer) return JsonArray::invalid();
  47. JsonArray &array = _buffer->createArray();
  48. add(array);
  49. return array;
  50. }
  51. JsonObject &JsonArray::createNestedObject() {
  52. if (!_buffer) return JsonObject::invalid();
  53. JsonObject &object = _buffer->createObject();
  54. add(object);
  55. return object;
  56. }
  57. template <typename T>
  58. void JsonArray::writeTo(T &writer) const {
  59. JsonArrayNode *child = _firstNode;
  60. if (child) {
  61. writer.beginArray();
  62. for (;;) {
  63. child->value.writeTo(writer);
  64. child = child->next;
  65. if (!child) break;
  66. writer.writeComma();
  67. }
  68. writer.endArray();
  69. } else {
  70. writer.writeEmptyArray();
  71. }
  72. }
  73. template void JsonArray::writeTo<CompactJsonWriter>(CompactJsonWriter &) const;
  74. template void JsonArray::writeTo<PrettyJsonWriter>(PrettyJsonWriter &) const;