Ver código fonte

Use Map to parse JSON

Daniele Bartolini 12 anos atrás
pai
commit
a5eed59fee

+ 5 - 6
engine/core/json/JSON.cpp

@@ -28,6 +28,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "ContainerTypes.h"
 #include "StringUtils.h"
 #include "DynamicString.h"
+#include "Map.h"
 
 namespace crown
 {
@@ -429,7 +430,7 @@ namespace json
 	}
 
 	//-----------------------------------------------------------------------------
-	void parse_object(const char* s, Array<JSONPair>& object)
+	void parse_object(const char* s, Map<DynamicString, const char*>& object)
 	{
 		CE_ASSERT_NOT_NULL(s);
 
@@ -449,9 +450,8 @@ namespace json
 
 			while (*ch)
 			{
-				JSONPair pair;
-
-				pair.key = ch;
+				DynamicString key;
+				parse_string(ch, key);
 
 				// Skip any value
 				ch = skip_array(ch);
@@ -465,8 +465,7 @@ namespace json
 				ch = next(ch, ':');
 				ch = skip_whites(ch);
 
-				pair.val = ch;
-				array::push_back(object, pair);
+				map::set(object, key, ch);
 
 				// Skip any value
 				ch = skip_array(ch);

+ 4 - 12
engine/core/json/JSON.h

@@ -26,6 +26,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #include "Types.h"
 #include "DynamicString.h"
+#include "ContainerTypes.h"
 
 #pragma once
 
@@ -50,15 +51,6 @@ struct JSONType
 	};
 };
 
-/// Represents a key-value pair in a JSON document.
-///
-/// @ingroup JSON
-struct JSONPair
-{
-	const char* key;
-	const char* val;
-};
-
 /// Functions to parse JSON-encoded strings.
 ///
 /// @ingroup JSON
@@ -86,8 +78,8 @@ namespace json
 	/// the corresponding items into the original @a s string.
 	void parse_array(const char* s, Array<const char*>& array);
 
-	/// Parses the @a s JSON object and puts it into @a object as pointers to
-	/// the corresponding key/value pairs into the original @a s string.
-	void parse_object(const char* s, Array<JSONPair>& object);
+	/// Parses the JSON object @a s and puts it into @a object as map from
+	/// key to pointer to the corresponding value into the original string @a s.
+	void parse_object(const char* s, Map<DynamicString, const char*>& object);
 } // namespace json
 } // namespace crown

+ 19 - 90
engine/core/json/JSONParser.cpp

@@ -28,7 +28,8 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "JSON.h"
 #include "TempAllocator.h"
 #include "StringUtils.h"
-#include "Log.h"
+#include "Vector.h"
+#include "Map.h"
 
 namespace crown
 {
@@ -100,28 +101,13 @@ JSONElement JSONElement::index_or_nil(uint32_t i)
 //--------------------------------------------------------------------------
 JSONElement JSONElement::key(const char* k)
 {
-	Array<JSONPair> object(default_allocator());
-
+	Map<DynamicString, const char*> object(default_allocator());
 	json::parse_object(m_at, object);
 
-	bool found = false;
-
-	const char* tmp_at = m_at;
-	for (uint32_t i = 0; i < array::size(object); i++)
-	{
-		DynamicString key;
-		json::parse_string(object[i].key, key);
-
-		if (key == k)
-		{
-			tmp_at = object[i].val;
-			found = true;
-		}
-	}
-
-	CE_ASSERT(found, "Key not found: '%s'", k);
+	const char* value = map::get(object, DynamicString(k), (const char*) NULL);
+	CE_ASSERT(value != NULL, "Key not found: '%s'", k);
 
-	return JSONElement(tmp_at);
+	return JSONElement(value);
 }
 
 //--------------------------------------------------------------------------
@@ -129,31 +115,13 @@ JSONElement JSONElement::key_or_nil(const char* k)
 {
 	if (m_at != NULL)
 	{
-		Array<JSONPair> object(default_allocator());
-
+		Map<DynamicString, const char*> object(default_allocator());
 		json::parse_object(m_at, object);
 
-		bool found = false;
+		const char* value = map::get(object, DynamicString(k), (const char*) NULL);
 
-		const char* tmp_at = m_at;
-		for (uint32_t i = 0; i < array::size(object); i++)
-		{
-			DynamicString key;
-			json::parse_string(object[i].key, key);
-
-			if (key == k)
-			{
-				tmp_at = object[i].val;
-				found = true;
-			}
-		}
-
-		if (!found)
-		{
-			return JSONElement();
-		}
-
-		return JSONElement(tmp_at);
+		if (value)
+			return JSONElement(value);
 	}
 
 	return JSONElement();
@@ -162,48 +130,10 @@ JSONElement JSONElement::key_or_nil(const char* k)
 //--------------------------------------------------------------------------
 bool JSONElement::has_key(const char* k) const
 {
-	Array<JSONPair> object(default_allocator());
-	json::parse_object(m_at, object);
-
-	for (uint32_t i = 0; i < array::size(object); i++)
-	{
-		DynamicString key;
-		json::parse_string(object[i].key, key);
-
-		if (key == k)
-		{
-			return true;
-		}
-	}
-
-	return false;
-}
-
-//--------------------------------------------------------------------------
-bool JSONElement::is_key_unique(const char* k) const
-{
-	Array<JSONPair> object(default_allocator());
+	Map<DynamicString, const char*> object(default_allocator());
 	json::parse_object(m_at, object);
 
-	bool found = false;
-
-	for (uint32_t i = 0; i < array::size(object); i++)
-	{
-		DynamicString key;
-		json::parse_string(object[i].key, key);
-
-		if (key == k)
-		{
-			if (found == true)
-			{
-				return false;
-			}
-
-			found = true;
-		}
-	}
-
-	return found;
+	return map::has(object, DynamicString(k));
 }
 
 //--------------------------------------------------------------------------
@@ -338,14 +268,14 @@ void JSONElement::to_array(Vector<DynamicString>& array) const
 //--------------------------------------------------------------------------
 void JSONElement::to_keys(Vector<DynamicString>& keys) const
 {
-	Array<JSONPair> object(default_allocator());
+	Map<DynamicString, const char*> object(default_allocator());
 	json::parse_object(m_at, object);
 
-	for (uint32_t i = 0; i < array::size(object); i++)
+	const typename Map<DynamicString, const char*>::Node* it = map::begin(object);
+	while (it != map::end(object))
 	{
-		DynamicString key;
-		json::parse_string(object[i].key, key);
-		vector::push_back(keys, key);
+		vector::push_back(keys, (*it).key);
+		it++;
 	}
 }
 
@@ -431,10 +361,9 @@ uint32_t JSONElement::size() const
 		}
 		case JSONType::OBJECT:
 		{
-			Array<JSONPair> object(default_allocator());
+			Map<DynamicString, const char*> object(default_allocator());
 			json::parse_object(m_at, object);
-
-			return array::size(object);
+			return map::size(object);
 		}
 		case JSONType::ARRAY:
 		{

+ 0 - 5
engine/core/json/JSONParser.h

@@ -28,7 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #include "Types.h"
 #include "ContainerTypes.h"
-#include "Vector.h"
 
 namespace crown
 {
@@ -78,10 +77,6 @@ public:
 	/// Returns whether the element has the @a k key.
 	bool				has_key(const char* k) const;
 
-	/// Returns whether the @a k key is unique in the object
-	/// element. If no such key is found it returns false.
-	bool				is_key_unique(const char* k) const;
-
 	/// Returns true wheter the element is the JSON nil special value.
 	bool				is_nil() const;