mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-16 12:02:14 +02:00
Extracted JsonNodeSerializer
This commit is contained in:
51
srcs/JsonNodeSerializer.cpp
Normal file
51
srcs/JsonNodeSerializer.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include "JsonNodeSerializer.h"
|
||||||
|
|
||||||
|
#include "EscapedString.h"
|
||||||
|
#include "JsonNode.h"
|
||||||
|
|
||||||
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
|
size_t JsonNodeSerializer::serialize(JsonNode const* node)
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
n += _sink.write('{');
|
||||||
|
|
||||||
|
JsonNode* firstChild = node->content.asObject.child;
|
||||||
|
|
||||||
|
for (JsonNode* child = firstChild; child; child = child->next)
|
||||||
|
{
|
||||||
|
const char* childKey = child->content.asKey.key;
|
||||||
|
JsonNode* childValue = child->content.asKey.value;
|
||||||
|
|
||||||
|
n += EscapedString::printTo(childKey, _sink);
|
||||||
|
n += _sink.write(':');
|
||||||
|
|
||||||
|
switch (childValue->type)
|
||||||
|
{
|
||||||
|
case JSON_STRING:
|
||||||
|
n += EscapedString::printTo(childValue->content.asString, _sink);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JSON_INTEGER:
|
||||||
|
n += _sink.print(childValue->content.asInteger);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JSON_BOOLEAN:
|
||||||
|
n += _sink.print(childValue->content.asBoolean ? "true" : "false");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childValue->type >= JSON_DOUBLE_0_DECIMALS)
|
||||||
|
n += _sink.print(childValue->content.asDouble, childValue->type - JSON_DOUBLE_0_DECIMALS);
|
||||||
|
|
||||||
|
if (child->next)
|
||||||
|
{
|
||||||
|
n += _sink.write(',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
n += _sink.write('}');
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
19
srcs/JsonNodeSerializer.h
Normal file
19
srcs/JsonNodeSerializer.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
class Print;
|
||||||
|
struct JsonNode;
|
||||||
|
|
||||||
|
class JsonNodeSerializer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit JsonNodeSerializer(Print& sink)
|
||||||
|
: _sink(sink)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t serialize(const JsonNode* node);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Print& _sink;
|
||||||
|
};
|
||||||
|
|
@ -7,6 +7,7 @@
|
|||||||
#include "JsonValue.h"
|
#include "JsonValue.h"
|
||||||
#include "JsonNode.h"
|
#include "JsonNode.h"
|
||||||
#include "StringBuilder.h"
|
#include "StringBuilder.h"
|
||||||
|
#include "JsonNodeSerializer.h"
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
@ -99,45 +100,6 @@ size_t JsonObject::printTo(char* buffer, size_t bufferSize) const
|
|||||||
|
|
||||||
size_t JsonObject::printTo(Print& p) const
|
size_t JsonObject::printTo(Print& p) const
|
||||||
{
|
{
|
||||||
size_t n = 0;
|
JsonNodeSerializer serializer(p);
|
||||||
|
return serializer.serialize(_node);
|
||||||
n += p.write('{');
|
|
||||||
|
|
||||||
JsonNode* firstChild = _node->content.asObject.child;
|
|
||||||
|
|
||||||
for (JsonNode* child = firstChild; child; child = child->next)
|
|
||||||
{
|
|
||||||
const char* childKey = child->content.asKey.key;
|
|
||||||
JsonNode* childValue = child->content.asKey.value;
|
|
||||||
|
|
||||||
n += EscapedString::printTo(childKey, p);
|
|
||||||
n += p.write(':');
|
|
||||||
|
|
||||||
switch (childValue->type)
|
|
||||||
{
|
|
||||||
case JSON_STRING:
|
|
||||||
n += EscapedString::printTo(childValue->content.asString, p);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JSON_INTEGER:
|
|
||||||
n += p.print(childValue->content.asInteger);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JSON_BOOLEAN:
|
|
||||||
n += p.print(childValue->content.asBoolean ? "true" : "false");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (childValue->type >= JSON_DOUBLE_0_DECIMALS)
|
|
||||||
n += p.print(childValue->content.asDouble, childValue->type - JSON_DOUBLE_0_DECIMALS);
|
|
||||||
|
|
||||||
if (child->next)
|
|
||||||
{
|
|
||||||
n += p.write(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
n += p.write('}');
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
}
|
@ -70,6 +70,7 @@
|
|||||||
<ClInclude Include="EscapedString.h" />
|
<ClInclude Include="EscapedString.h" />
|
||||||
<ClInclude Include="JsonBuffer.h" />
|
<ClInclude Include="JsonBuffer.h" />
|
||||||
<ClInclude Include="JsonNode.h" />
|
<ClInclude Include="JsonNode.h" />
|
||||||
|
<ClInclude Include="JsonNodeSerializer.h" />
|
||||||
<ClInclude Include="JsonObject.h" />
|
<ClInclude Include="JsonObject.h" />
|
||||||
<ClInclude Include="JsonValue.h" />
|
<ClInclude Include="JsonValue.h" />
|
||||||
<ClInclude Include="Print.h" />
|
<ClInclude Include="Print.h" />
|
||||||
@ -80,6 +81,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="EscapedString.cpp" />
|
<ClCompile Include="EscapedString.cpp" />
|
||||||
<ClCompile Include="JsonBuffer.cpp" />
|
<ClCompile Include="JsonBuffer.cpp" />
|
||||||
|
<ClCompile Include="JsonNodeSerializer.cpp" />
|
||||||
<ClCompile Include="JsonObject.cpp" />
|
<ClCompile Include="JsonObject.cpp" />
|
||||||
<ClCompile Include="JsonValue.cpp" />
|
<ClCompile Include="JsonValue.cpp" />
|
||||||
<ClCompile Include="Print.cpp" />
|
<ClCompile Include="Print.cpp" />
|
||||||
|
@ -42,6 +42,9 @@
|
|||||||
<ClInclude Include="EscapedString.h">
|
<ClInclude Include="EscapedString.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="JsonNodeSerializer.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="JsonObject.cpp">
|
<ClCompile Include="JsonObject.cpp">
|
||||||
@ -62,5 +65,8 @@
|
|||||||
<ClCompile Include="EscapedString.cpp">
|
<ClCompile Include="EscapedString.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="JsonNodeSerializer.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Reference in New Issue
Block a user