Added JsonObjectIterator

This commit is contained in:
Benoit Blanchon
2014-07-18 22:40:50 +02:00
parent b75d32e980
commit 851d21e08c
8 changed files with 158 additions and 16 deletions

View File

@ -22,10 +22,9 @@ namespace ArduinoJson
} }
const JsonArrayIterator& operator++() void operator++()
{ {
token = token.nextSibling(); token = token.nextSibling();
return *this;
} }
JsonValue operator*() const JsonValue operator*() const

View File

@ -6,6 +6,7 @@
#pragma once #pragma once
#include "JsonValue.h" #include "JsonValue.h"
#include "JsonObjectIterator.h"
namespace ArduinoJson namespace ArduinoJson
{ {
@ -43,6 +44,16 @@ namespace ArduinoJson
return getValue(key).success(); return getValue(key).success();
} }
JsonObjectIterator begin()
{
return JsonObjectIterator(json, token.firstChild());
}
JsonObjectIterator end()
{
return JsonObjectIterator(json, token.nextSibling());
}
DEPRECATED JsonArray getArray(const char* key); DEPRECATED JsonArray getArray(const char* key);
DEPRECATED bool getBool(const char* key) DEPRECATED bool getBool(const char* key)

View File

@ -0,0 +1,47 @@
/*
* Arduino JSON library
* Benoit Blanchon 2014 - MIT License
*/
#pragma once
#include "JsonValue.h"
#include "JsonPair.h"
#include "JsonToken.h"
namespace ArduinoJson
{
namespace Parser
{
class JsonObjectIterator
{
public:
JsonObjectIterator(char* json, Internal::JsonToken token)
: json(json), token(token)
{
}
void operator++()
{
token = token.nextSibling().nextSibling();
}
JsonPair operator*() const
{
return JsonPair(json, token);
}
bool operator !=(const JsonObjectIterator& other)
{
return token != other.token;
}
private:
char* json;
Internal::JsonToken token;
};
}
}

39
JsonParser/JsonPair.h Normal file
View File

@ -0,0 +1,39 @@
/*
* Arduino JSON library
* Benoit Blanchon 2014 - MIT License
*/
#pragma once
#include "JsonValue.h"
namespace ArduinoJson
{
namespace Parser
{
class JsonPair
{
public:
JsonPair(char* json, Internal::JsonToken token)
: json(json), token(token)
{
}
const char* key()
{
return token.getText(json);
}
JsonValue value()
{
return JsonValue(json, token.nextSibling());
}
private:
char* json;
Internal::JsonToken token;
};
}
}

View File

@ -7,25 +7,28 @@ using namespace ArduinoJson::Parser;
namespace JsonParserTests namespace JsonParserTests
{ {
TEST_CLASS(JsonArrayIteratorTests) TEST_CLASS(JsonObjectIteratorTests)
{ {
public: public:
TEST_METHOD(ThreeIntegers) TEST_METHOD(ThreeStrings)
{ {
char json [] = "[1,2,3]"; char json [] = "{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\"}";
long expected [] = { 1, 2, 3 }; char* expectedKeys [] = { "key1", "key2", "key3" };
JsonParser<4> parser; char* expectedValues [] = { "value1", "value2", "value3" };
JsonParser<7> parser;
JsonArray a = parser.parse(json); JsonHashTable a = parser.parse(json);
int index = 0; int index = 0;
for (long i : a) for (auto i : a)
{ {
Assert::AreEqual(expected[index++], i); Assert::AreEqual(expectedKeys[index], i.key());
Assert::AreEqual(expectedValues[index], (const char*) i.value());
index++;
} }
} }
}; };
} }

View File

@ -0,0 +1,31 @@
#include "CppUnitTest.h"
#include "JsonParser.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace ArduinoJson::Parser;
namespace JsonParserTests
{
TEST_CLASS(JsonArrayIteratorTests)
{
public:
TEST_METHOD(ThreeIntegers)
{
char json [] = "[1,2,3]";
long expected [] = { 1, 2, 3 };
JsonParser<4> parser;
JsonArray a = parser.parse(json);
int index = 0;
for (long i : a)
{
Assert::AreEqual(expected[index++], i);
}
}
};
}

View File

@ -93,6 +93,7 @@
<ClCompile Include="..\JsonParser\JsonValue.cpp" /> <ClCompile Include="..\JsonParser\JsonValue.cpp" />
<ClCompile Include="JsonArrayIteratorTests.cpp" /> <ClCompile Include="JsonArrayIteratorTests.cpp" />
<ClCompile Include="JsonArrayTests.cpp" /> <ClCompile Include="JsonArrayTests.cpp" />
<ClCompile Include="JsonObjectIteratorTests.cpp" />
<ClCompile Include="JsonObjectTests.cpp" /> <ClCompile Include="JsonObjectTests.cpp" />
<ClCompile Include="GbathreeBug.cpp" /> <ClCompile Include="GbathreeBug.cpp" />
</ItemGroup> </ItemGroup>
@ -101,6 +102,8 @@
<ClInclude Include="..\JsonParser\JsonArray.h" /> <ClInclude Include="..\JsonParser\JsonArray.h" />
<ClInclude Include="..\JsonParser\JsonArrayIterator.h" /> <ClInclude Include="..\JsonParser\JsonArrayIterator.h" />
<ClInclude Include="..\JsonParser\JsonObject.h" /> <ClInclude Include="..\JsonParser\JsonObject.h" />
<ClInclude Include="..\JsonParser\JsonObjectIterator.h" />
<ClInclude Include="..\JsonParser\JsonPair.h" />
<ClInclude Include="..\JsonParser\JsonParser.h" /> <ClInclude Include="..\JsonParser\JsonParser.h" />
<ClInclude Include="..\JsonParser\JsonParserBase.h" /> <ClInclude Include="..\JsonParser\JsonParserBase.h" />
<ClInclude Include="..\JsonParser\JsonToken.h" /> <ClInclude Include="..\JsonParser\JsonToken.h" />

View File

@ -45,6 +45,9 @@
<ClCompile Include="JsonObjectTests.cpp"> <ClCompile Include="JsonObjectTests.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="JsonObjectIteratorTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\JsonParser\jsmn.h"> <ClInclude Include="..\JsonParser\jsmn.h">
@ -71,5 +74,11 @@
<ClInclude Include="..\JsonParser\JsonObject.h"> <ClInclude Include="..\JsonParser\JsonObject.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\JsonParser\JsonPair.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\JsonParser\JsonObjectIterator.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>