Extracted JsonNodeSerializer

This commit is contained in:
Benoit Blanchon
2014-10-01 12:28:30 +02:00
parent a665fa1dec
commit c99bdbf4b9
5 changed files with 81 additions and 41 deletions

View 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
View 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;
};

View File

@ -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;
} }

View File

@ -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" />

View File

@ -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>