aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/basetypes/MCJSON.cpp
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-04-18 23:02:14 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-04-18 23:02:35 -0700
commitd1b9c95df87106da90916a8cd5ae9b919eb68d8e (patch)
tree009d81c8a4326859409615ff649bb7402ba964a0 /src/core/basetypes/MCJSON.cpp
parent030ad16caa4da511c26c0d89ed89033450cc18b6 (diff)
Implemented JSON parser with Unicode support. Implemented iterators
Diffstat (limited to 'src/core/basetypes/MCJSON.cpp')
-rw-r--r--src/core/basetypes/MCJSON.cpp235
1 files changed, 13 insertions, 222 deletions
diff --git a/src/core/basetypes/MCJSON.cpp b/src/core/basetypes/MCJSON.cpp
index f6bc5956..20b4876f 100644
--- a/src/core/basetypes/MCJSON.cpp
+++ b/src/core/basetypes/MCJSON.cpp
@@ -10,241 +10,32 @@
#include <string.h>
-#include "libjson.h"
-#include "MCNull.h"
-#include <MailCore/MCUtils.h>
-#include <MailCore/MCAssert.h>
+#include "MCJSONParser.h"
using namespace mailcore;
-String * JSON::objectToJSONString(Object * object, bool pretty)
-{
- void * node = objectToJSON(object);
- char * cstr;
- if (pretty) {
- cstr = json_write_formatted(node);
- }
- else {
- cstr = json_write(node);
- }
-
- String * result = String::stringWithUTF8Characters(cstr);
-
- json_free(cstr);
- json_delete(node);
-
- return result;
-}
-
-Data * JSON::objectToJSONData(Object * object, bool pretty)
-{
- void * node = objectToJSON(object);
- char * cstr;
- if (pretty) {
- cstr = json_write_formatted(node);
- }
- else {
- cstr = json_write(node);
- }
-
- Data * result = Data::dataWithBytes(cstr, (unsigned int) strlen(cstr));
-
- json_free(cstr);
- json_delete(node);
-
- return result;
-}
-
-Object * JSON::objectFromJSONString(String * json)
-{
- void * node = json_parse(json->UTF8Characters());
- Object * object = objectFromJSON(node);
- json_delete(node);
- return object;
-}
-
-Object * JSON::objectFromJSONData(Data * json)
-{
- //printf("rcv: [%.*s]\n", (int) json->length(), json->bytes());
-
- void * node = json_parse(json->bytes());
- Object * object = objectFromJSON(node);
- json_delete(node);
- return object;
-}
-
-void * JSON::hashMapToJSON(HashMap * hashmap)
-{
- JSONNODE * result = json_new(JSON_NODE);
- Array * keys = hashmap->allKeys();
- for(unsigned int i = 0 ; i < keys->count() ; i ++) {
- String * key = (String *) keys->objectAtIndex(i);
- JSONNODE * item = objectToJSON(hashmap->objectForKey(key));
- json_set_name(item, key->UTF8Characters());
- json_push_back(result, item);
- }
- return result;
-}
-
-void * JSON::arrayToJSON(Array * array)
-{
- JSONNODE * result = json_new(JSON_ARRAY);
- for(unsigned int i = 0 ; i < array->count() ; i ++) {
- Object * value = array->objectAtIndex(i);
- JSONNODE * item = objectToJSON(value);
- json_push_back(result, item);
- }
- return result;
-}
-
-void * JSON::stringToJSON(String * string)
-{
- return json_new_a("", string->UTF8Characters());
-}
+static Object * objectFromData(Data * data);
+static Object * objectFromString(String * str);
-void * JSON::doubleToJSON(Value * value)
-{
- switch (value->type()) {
- case ValueTypeChar:
- return json_new_f("", value->charValue());
- case ValueTypeUnsignedChar:
- return json_new_f("", value->unsignedCharValue());
- case ValueTypeShort:
- return json_new_f("", value->shortValue());
- case ValueTypeUnsignedShort:
- return json_new_f("", value->unsignedShortValue());
- case ValueTypeInt:
- return json_new_f("", value->intValue());
- case ValueTypeUnsignedInt:
- return json_new_f("", value->unsignedIntValue());
- case ValueTypeLong:
- return json_new_f("", value->longValue());
- case ValueTypeUnsignedLong:
- return json_new_f("", value->unsignedLongValue());
- case ValueTypeLongLong:
- return json_new_f("", value->longLongValue());
- case ValueTypeUnsignedLongLong:
- return json_new_f("", value->unsignedLongLongValue());
- case ValueTypeFloat:
- return json_new_f("", value->floatValue());
- case ValueTypeDouble:
- return json_new_f("", value->doubleValue());
- default:
- return json_new_f("", 0.);
- }
-}
-
-void * JSON::boolToJSON(Value * value)
-{
- return json_new_b("", value->boolValue());
-}
-
-void * JSON::nullToJSON(Null * value)
-{
- return json_new(JSON_NULL);
-}
-
-void * JSON::objectToJSON(Object * object)
-{
- String * name = object->className();
- if (name->isEqual(MCSTR("mailcore::Null"))) {
- return nullToJSON((Null *) object);
- }
- else if (name->isEqual(MCSTR("mailcore::Value"))) {
- Value * value = (Value *) object;
- if (value->type() == ValueTypeBool) {
- return boolToJSON(value);
- }
- else {
- return doubleToJSON(value);
- }
- }
- else if (name->isEqual(MCSTR("mailcore::String"))) {
- return stringToJSON((String *) object);
- }
- else if (name->isEqual(MCSTR("mailcore::Array"))) {
- return arrayToJSON((Array *) object);
- }
- else if (name->isEqual(MCSTR("mailcore::HashMap"))) {
- return hashMapToJSON((HashMap *) object);
- }
- else {
- MCAssert(0);
- return NULL;
- }
-}
+static Data * dataFromObject(Object * object);
+static String * stringFromObject(Object * object);
-HashMap * JSON::hashMapFromJSON(void * json)
+String * JSON::objectToJSONString(Object * object)
{
- HashMap * result = HashMap::hashMap();
- JSONNODE_ITERATOR i = json_begin(json);
- while (i != json_end(json)){
- json_char * ckey = json_name(*i);
- String * key = String::stringWithUTF8Characters(ckey);
- Object * value = objectFromJSON(* i);
-
- result->setObjectForKey(key, value);
-
- json_free(ckey);
- ++i;
- }
- return result;
+ return JSONParser::stringFromObject(object);
}
-Array * JSON::arrayFromJSON(void * json)
+Data * JSON::objectToJSONData(Object * object)
{
- Array * result = Array::array();
- JSONNODE_ITERATOR i = json_begin(json);
- while (i != json_end(json)){
- Object * obj = objectFromJSON(* i);
- result->addObject(obj);
- ++i;
- }
- return result;
+ return JSONParser::dataFromObject(object);
}
-String * JSON::stringFromJSON(void * json)
-{
- json_char * cstr = json_as_string(json);
- String * result = String::stringWithUTF8Characters(cstr);
- json_free(cstr);
- return result;
-}
-
-Value * JSON::doubleFromJSON(void * json)
-{
- json_number value = json_as_float(json);
- return Value::valueWithDoubleValue(value);
-}
-
-Value * JSON::boolFromJSON(void * json)
-{
- json_bool_t value = json_as_bool(json);
- return Value::valueWithBoolValue(value);
-}
-
-Null * JSON::nullFromJSON(void * json)
+Object * JSON::objectFromJSONString(String * json)
{
- return Null::null();
+ return JSONParser::objectFromString(json);
}
-Object * JSON::objectFromJSON(void * json)
+Object * JSON::objectFromJSONData(Data * json)
{
- switch (json_type(json)) {
- case JSON_NULL:
- return nullFromJSON(json);
- case JSON_STRING:
- return stringFromJSON(json);
- case JSON_NUMBER:
- return doubleFromJSON(json);
- case JSON_BOOL:
- return boolFromJSON(json);
- case JSON_ARRAY:
- return arrayFromJSON(json);
- case JSON_NODE:
- return hashMapFromJSON(json);
- default:
- MCAssert(0);
- return NULL;
- }
+ return JSONParser::objectFromData(json);
}