You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/05/24 07:03:24 UTC

[09/10] incubator-weex git commit: [WEEX-378][android] wson support for weex-core new architecture and remove rapidjson

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp b/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
index 6cd9dce..36eeabd 100644
--- a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
+++ b/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
@@ -265,10 +265,13 @@ std::unique_ptr<IPCResult> handleCallNativeModule(IPCArguments *arguments) {
   char* pageId = getArumentAsCStr(arguments, 0);
   char* module = getArumentAsCStr(arguments, 1);
   char* method = getArumentAsCStr(arguments, 2);
-  char* argString = getArumentAsCStr(arguments, 3);
-  char* optString = getArumentAsCStr(arguments, 4);
+  char* argumentsData = getArumentAsCStr(arguments, 3);
+  int   argumentsDataLength = getArumentAsCStrLen(arguments, 3);
+  char* optionsData = getArumentAsCStr(arguments, 4);
+  int   optionsDataLength = getArumentAsCStrLen(arguments, 4);
 
-  std::unique_ptr<IPCResult> ret = _callNativeModule(pageId,module,method,argString,optString);
+  std::unique_ptr<IPCResult> ret = _callNativeModule(pageId,module,method,argumentsData,
+                                                     argumentsDataLength, optionsData, optionsDataLength);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -282,13 +285,13 @@ std::unique_ptr<IPCResult> handleCallNativeModule(IPCArguments *arguments) {
     delete[]method;
     method = nullptr;
   }
-  if (argString != nullptr) {
-    delete[]argString;
-    argString = nullptr;
+  if (argumentsData != nullptr) {
+    delete[]argumentsData;
+    argumentsData = nullptr;
   }
-  if (optString != nullptr) {
-    delete[]optString;
-    optString = nullptr;
+  if (optionsData != nullptr) {
+    delete[]optionsData;
+    optionsData = nullptr;
   }
   return ret;
 }
@@ -297,10 +300,12 @@ std::unique_ptr<IPCResult> handleCallNativeComponent(IPCArguments *arguments) {
   char* pageId = getArumentAsCStr(arguments, 0);
   char* ref = getArumentAsCStr(arguments, 1);
   char* method = getArumentAsCStr(arguments, 2);
-  char* argString = getArumentAsCStr(arguments, 3);
-  char* optString = getArumentAsCStr(arguments, 4);
+  char* argumentsData = getArumentAsCStr(arguments, 3);
+  int   argumentsDataLength = getArumentAsCStrLen(arguments, 3);
+  char* optionsData = getArumentAsCStr(arguments, 4);
+  int   optionsDataLength = getArumentAsCStrLen(arguments, 4);
 
-    _callNativeComponent(pageId, ref, method, argString, optString);
+  _callNativeComponent(pageId, ref, method, argumentsData, argumentsDataLength, optionsData, optionsDataLength);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -314,13 +319,13 @@ std::unique_ptr<IPCResult> handleCallNativeComponent(IPCArguments *arguments) {
     delete[]method;
     method = nullptr;
   }
-  if (argString != nullptr) {
-    delete[]argString;
-    argString = nullptr;
+  if (argumentsData != nullptr) {
+    delete[]argumentsData;
+    argumentsData = nullptr;
   }
-  if (optString != nullptr) {
-    delete[]optString;
-    optString = nullptr;
+  if (optionsData != nullptr) {
+    delete[]optionsData;
+    optionsData = nullptr;
   }
   return createInt32Result(static_cast<int32_t>(true));
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp b/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
index 44a9aca..0c8f70c 100644
--- a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
+++ b/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
@@ -110,6 +110,80 @@ namespace WeexCore {
         return param;
     }
 
+    inline void addParamsFromJArgs(std::vector<VALUE_WITH_TYPE *>& params, VALUE_WITH_TYPE *param, std::unique_ptr<IPCSerializer>& serializer, JNIEnv* env, jobject jArg){
+        jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
+        jint jTypeInt = env->GetIntField(jArg, jTypeId);
+
+        jfieldID jDataId = env->GetFieldID(jWXJSObject, "data", "Ljava/lang/Object;");
+        jobject jDataObj = env->GetObjectField(jArg, jDataId);
+        if (jTypeInt == 1) {
+            if (jDoubleValueMethodId == NULL) {
+                jclass jDoubleClazz = env->FindClass("java/lang/Double");
+                jDoubleValueMethodId = env->GetMethodID(jDoubleClazz, "doubleValue", "()D");
+                env->DeleteLocalRef(jDoubleClazz);
+            }
+            jdouble jDoubleObj = env->CallDoubleMethod(jDataObj, jDoubleValueMethodId);
+            if (js_server_api_functions != nullptr) {
+                param->type = ParamsType::DOUBLE;
+                param->value.doubleValue = jDoubleObj;
+            } else {
+                serializer->add(jDoubleObj);
+            }
+
+        } else if (jTypeInt == 2) {
+            jstring jDataStr = (jstring) jDataObj;
+            if (js_server_api_functions != nullptr) {
+                param->type = ParamsType::STRING;
+                param->value.string = jstring2WeexString(env, jDataStr);
+            } else {
+                addString(env, serializer.get(), jDataStr);
+            }
+        } else if (jTypeInt == 3) {
+            jstring jDataStr = (jstring) jDataObj;
+            if (js_server_api_functions != nullptr) {
+                param->type = ParamsType::JSONSTRING;
+                param->value.string = jstring2WeexString(env, jDataStr);
+            } else {
+                addJSONString(env, serializer.get(), jDataStr);
+            }
+        } else if (jTypeInt == 4) {
+            jbyteArray dataArray = (jbyteArray) jDataObj;
+            if (js_server_api_functions != nullptr) {
+                param->type = ParamsType::BYTEARRAY;
+                jbyte* data = env->GetByteArrayElements(dataArray, 0);
+                size_t length = env->GetArrayLength(dataArray);
+                param->value.byteArray = genWeexByteArray((const char *) data, length);
+            } else {
+                addBinaryByteArray(env, serializer.get(), dataArray);
+            }
+        } else {
+            if (js_server_api_functions != nullptr) {
+                param->type = ParamsType::JSUNDEFINED;
+            } else {
+                serializer->addJSUndefined();
+            }
+        }
+
+        if (param != nullptr){
+            params.push_back(param);
+        }
+
+        env->DeleteLocalRef(jDataObj);
+    }
+
+    inline void freeParams(std::vector<VALUE_WITH_TYPE *>& params){
+        for (auto &param : params) {
+            if (param->type == ParamsType::STRING ||
+                param->type == ParamsType::JSONSTRING) {
+                free(param->value.string);
+            }
+            if (param->type == ParamsType::BYTEARRAY) {
+                free(param->value.byteArray);
+            }
+            free(param);
+        }
+    }
+
     jint WeexProxy::doInitFramework(JNIEnv *env, jobject object,
                                     jstring script, jobject params,
                                     jstring cacheDir, jboolean pieSupport) {
@@ -295,55 +369,7 @@ namespace WeexCore {
                 }
 
                 jobject jArg = env->GetObjectArrayElement(jargs, i);
-
-                jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
-                jint jTypeInt = env->GetIntField(jArg, jTypeId);
-
-                jfieldID jDataId = env->GetFieldID(jWXJSObject,
-                                                   "data", "Ljava/lang/Object;");
-                jobject jDataObj = env->GetObjectField(jArg, jDataId);
-                if (jTypeInt == 1) {
-                    if (jDoubleValueMethodId == NULL) {
-                        jclass jDoubleClazz = env->FindClass("java/lang/Double");
-                        jDoubleValueMethodId = env->GetMethodID(jDoubleClazz,
-                                                                "doubleValue", "()D");
-                        env->DeleteLocalRef(jDoubleClazz);
-                    }
-                    jdouble jDoubleObj = env->CallDoubleMethod(jDataObj,
-                                                               jDoubleValueMethodId);
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::DOUBLE;
-                        param->value.doubleValue = jDoubleObj;
-                    } else {
-                        serializer->add(jDoubleObj);
-                    }
-
-                } else if (jTypeInt == 2) {
-                    jstring jDataStr = (jstring) jDataObj;
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::STRING;
-                        param->value.string = jstring2WeexString(env, jDataStr);
-                    } else {
-                        addString(env, serializer.get(), jDataStr);
-                    }
-                } else if (jTypeInt == 3) {
-                    jstring jDataStr = (jstring) jDataObj;
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::JSONSTRING;
-                        param->value.string = jstring2WeexString(env, jDataStr);
-                    } else {
-                        addJSONString(env, serializer.get(), jDataStr);
-                    }
-                } else {
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::JSUNDEFINED;
-                    } else {
-                        serializer->addJSUndefined();
-                    }
-                }
-                if (param != nullptr)
-                    params.push_back(param);
-                env->DeleteLocalRef(jDataObj);
+                addParamsFromJArgs(params, param,serializer, env, jArg);
                 env->DeleteLocalRef(jArg);
             }
 
@@ -363,13 +389,7 @@ namespace WeexCore {
                                                            name,
                                                            funcChar.getChars(),
                                                            params);
-                for (auto &param : params) {
-                    if (param->type == ParamsType::STRING ||
-                        param->type == ParamsType::JSONSTRING) {
-                        free(param->value.string);
-                    }
-                    free(param);
-                }
+                freeParams(params);
                 return static_cast<bool>(i);
             } else {
                 std::unique_ptr<IPCBuffer> buffer = serializer->finish();
@@ -929,73 +949,26 @@ namespace WeexCore {
                 }
 
                 jobject jArg = env->GetObjectArrayElement(jargs, i);
-
-                jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
-                jint jTypeInt = env->GetIntField(jArg, jTypeId);
-
-                jfieldID jDataId = env->GetFieldID(jWXJSObject, "data", "Ljava/lang/Object;");
-                jobject jDataObj = env->GetObjectField(jArg, jDataId);
-                if (jTypeInt == 1) {
-                    if (jDoubleValueMethodId == NULL) {
-                        jclass jDoubleClazz = env->FindClass("java/lang/Double");
-                        jDoubleValueMethodId = env->GetMethodID(jDoubleClazz, "doubleValue",
-                                                                "()D");
-                        env->DeleteLocalRef(jDoubleClazz);
-                    }
-                    jdouble jDoubleObj = env->CallDoubleMethod(jDataObj, jDoubleValueMethodId);
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::DOUBLE;
-                        param->value.doubleValue = jDoubleObj;
-                    } else {
-                        serializer->add(jDoubleObj);
-                    }
-
-                } else if (jTypeInt == 2) {
-                    jstring jDataStr = (jstring) jDataObj;
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::STRING;
-                        param->value.string = jstring2WeexString(env, jDataStr);
-                    } else {
-                        addString(env, serializer.get(), jDataStr);
-                    }
-                } else if (jTypeInt == 3) {
-                    jstring jDataStr = (jstring) jDataObj;
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::JSONSTRING;
-                        param->value.string = jstring2WeexString(env, jDataStr);
-                    } else {
-                        addJSONString(env, serializer.get(), jDataStr);
-                    }
-                } else {
-                    if (js_server_api_functions != nullptr) {
-                        param->type = ParamsType::JSUNDEFINED;
-                    } else {
-                        serializer->addJSUndefined();
-                    }
-                }
-                if (param != nullptr)
-                    params.push_back(param);
-                env->DeleteLocalRef(jDataObj);
+                addParamsFromJArgs(params, param, serializer, env, jArg);
                 env->DeleteLocalRef(jArg);
             }
 
             if (js_server_api_functions != nullptr) {
-                char *result = js_server_api_functions->funcExeJSWithResult(
-                        env->GetStringUTFChars(jinstanceid,
-                                               nullptr),
-                        env->GetStringUTFChars(jnamespace,
-                                               nullptr),
-                        env->GetStringUTFChars(jfunction,
-                                               nullptr),
-                        params);
-                for (auto &param : params) {
-                    if (param->type == ParamsType::STRING ||
-                        param->type == ParamsType::JSONSTRING) {
-                        free(param->value.string);
-                    }
-                    free(param);
+                ScopedJStringUTF8 instanceidChar(env, jinstanceid);
+                const char *namespaceChar;
+                if (jnamespace) {
+                    ScopedJStringUTF8 nameSpaceChar(env, jnamespace);
+                    namespaceChar = nameSpaceChar.getChars();
+                } else {
+                    namespaceChar = nullptr;
                 }
-                return newJByteArray(env, result);
+                ScopedJStringUTF8 functionChar(env, jfunction);
+                WeexJSResult jsResultData = js_server_api_functions->funcExeJSWithResult(
+                        instanceidChar.getChars(), namespaceChar, functionChar.getChars(), params);
+                freeParams(params);
+                jbyteArray  array = newJByteArray(env, jsResultData.data, jsResultData.length);
+                WeexJSResultDataFree(jsResultData);
+                return array;
             } else {
 
                 std::unique_ptr<IPCBuffer> buffer = serializer->finish();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/api/WeexJSCoreApi.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/api/WeexJSCoreApi.cpp b/weex_core/Source/core/api/WeexJSCoreApi.cpp
index 3ff7532..70ca722 100644
--- a/weex_core/Source/core/api/WeexJSCoreApi.cpp
+++ b/weex_core/Source/core/api/WeexJSCoreApi.cpp
@@ -25,6 +25,7 @@
 #include <core/render/manager/render_manager.h>
 #include <android/jsengine/multiprocess/ExtendJSApi.h>
 #include <android/base/string/string_utils.h>
+#include <wson/wson_parser.h>
 
 using namespace WeexCore;
 
@@ -56,7 +57,7 @@ void _callNative(const char *pageId, const char *task, const char *callback) {
 
 std::unique_ptr<IPCResult>
 _callNativeModule(const char *pageId, const char *module, const char *method,
-                  const char *argString, const char *optString) {
+                  const char *arguments, int argumentsLength, const char *options, int optionsLength) {
     std::unique_ptr<IPCResult> ret = createInt32Result(-1);
     if (pageId != nullptr && module != nullptr && method != nullptr) {
 #if JSAPI_LOG
@@ -67,10 +68,10 @@ _callNativeModule(const char *pageId, const char *module, const char *method,
         // add for android support
         jobject result;
         result = Bridge_Impl_Android::getInstance()->callNativeModule(pageId, module, method,
-                                                                      argString, optString);
-
-        if (result == nullptr)
+                                                                      arguments,  argumentsLength, options, optionsLength);
+        if (result == nullptr){
             return ret;
+        }
 
         JNIEnv *env = getJNIEnv();
         jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
@@ -92,16 +93,26 @@ _callNativeModule(const char *pageId, const char *module, const char *method,
         } else if (jTypeInt == 3) {
             jstring jDataStr = (jstring) jDataObj;
             ret = std::move(createJSONStringResult(env, jDataStr));
+        } else if (jTypeInt == 4) {
+            jbyteArray array = (jbyteArray)jDataObj;
+            if(array != nullptr){
+                int length = env->GetArrayLength(array);
+                void* data = env->GetByteArrayElements(array, 0);
+                ret = std::move(createByteArrayResult((const char*)data, length));
+                env->ReleaseByteArrayElements(array, (jbyte*)data, 0);
+            }
         }
         env->DeleteLocalRef(jDataObj);
+        if(result != nullptr){
+            env->DeleteLocalRef(result);
+        }
     }
 
     return ret;
 }
 
-void _callNativeComponent(const char *pageId, const char *ref,
-                          const char *method, const char *argString,
-                          const char *optString) {
+void _callNativeComponent(const char *pageId, const char *ref, const char *method,
+                          const char *arguments, int argumentsLength, const char *options, int optionsLength) {
     if (pageId != nullptr && ref != nullptr && method != nullptr) {
 
 #if JSAPI_LOG
@@ -109,8 +120,8 @@ void _callNativeComponent(const char *pageId, const char *ref,
          pageId, ref, method, argString, optString);
 #endif
 
-        Bridge_Impl_Android::getInstance()->callNativeComponent(pageId, ref, method, argString,
-                                                                optString);
+        Bridge_Impl_Android::getInstance()->callNativeComponent(pageId, ref, method,
+                                                                arguments, argumentsLength, options, optionsLength);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/api/WeexJSCoreApi.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/api/WeexJSCoreApi.h b/weex_core/Source/core/api/WeexJSCoreApi.h
index 8ef33cc..cf0b81e 100644
--- a/weex_core/Source/core/api/WeexJSCoreApi.h
+++ b/weex_core/Source/core/api/WeexJSCoreApi.h
@@ -37,11 +37,11 @@ void _callNative(const char *pageId, const char *task, const char *callback);
 
 
 std::unique_ptr<IPCResult> _callNativeModule(const char *pageId, const char *module, const char *method,
-                       const char *argString, const char *optString);
+                       const char *arguments, int argumentsLength, const char *options, int optionsLength);
 
 void _callNativeComponent(const char *pageId, const char *ref,
-                          const char *method, const char *argString,
-                          const char *optString);
+                          const char *method,
+                          const char *arguments, int argumentsLength, const char *options, int optionsLength);
 
 void _callAddElement(const char *pageId, const char *parentRef, const char *domStr,
                      const char *index_cstr);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/bridge/bridge.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/bridge/bridge.h b/weex_core/Source/core/bridge/bridge.h
index 4494ac5..591bb89 100644
--- a/weex_core/Source/core/bridge/bridge.h
+++ b/weex_core/Source/core/bridge/bridge.h
@@ -42,10 +42,10 @@ namespace WeexCore {
     virtual int callNative(const char* pageId, const char *task, const char *callback) = 0;
 
     virtual jobject callNativeModule(const char* pageId, const char *module, const char *method,
-                                     const char *argString, const char *optString) = 0;
+                                     const char *arguments, int argumentsLength, const char *options, int optionsLength) = 0;
 
     virtual void callNativeComponent(const char* pageId, const char* ref, const char *method,
-                                     const char *argString, const char *optString) = 0;
+                                     const char *arguments, int argumentsLength, const char *options, int optionsLength) = 0;
 
     virtual void setTimeout(const char* callbackID, const char* time) = 0;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/parser/dom_parser.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/parser/dom_parser.cpp b/weex_core/Source/core/parser/dom_parser.cpp
deleted file mode 100644
index 216ad72..0000000
--- a/weex_core/Source/core/parser/dom_parser.cpp
+++ /dev/null
@@ -1,532 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "dom_parser.h"
-#include <core/render/node/render_object.h>
-#include <core/render/page/render_page.h>
-#include <core/render/node/factory/render_creator.h>
-#include <base/ViewUtils.h>
-
-using namespace std;
-using namespace rapidjson;
-
-namespace WeexCore {
-
-  static inline int matchNum(std::string temp, std::string key, int startIndex, int endIndex) {
-    int num = 0;
-    while (startIndex < endIndex) {
-      int index = temp.find(key, startIndex);
-      if (index >= 0 && index < endIndex) {
-        num++;
-        startIndex = index + 1;
-      } else {
-        break;
-      }
-    }
-    return num;
-  }
-
-  static inline int GetSplitIndex(std::string temp, const char * leftChar, const char * rightChar){
-    int endIndex = temp.find(rightChar);
-    if(endIndex > 0) {
-      // has found!
-      int temp_length = temp.length();
-      int startIndex = 0;
-      int leftMatchSize = matchNum(temp, leftChar, startIndex, endIndex) - 1;
-      while (leftMatchSize > 0 && startIndex <= endIndex && startIndex < temp_length) {
-        startIndex = endIndex + 1;
-        int markIndex = temp.find(rightChar, startIndex);
-        if(markIndex > 0) {
-          endIndex = markIndex;
-          leftMatchSize--;
-        }
-        leftMatchSize += matchNum(temp, leftChar, startIndex, endIndex);
-      }
-    }
-    return endIndex;
-  }
-
-  bool JsonParserHandler::Null() {
-    st_ = kHasNull;
-    v_.SetNull();
-    return true;
-  }
-
-  bool JsonParserHandler::Bool(bool b) {
-    st_ = kHasBool;
-    v_.SetBool(b);
-    return true;
-  }
-
-  bool JsonParserHandler::Int(int i) {
-    st_ = kHasNumber;
-    v_.SetInt(i);
-    return true;
-  }
-
-  bool JsonParserHandler::Uint(unsigned u) {
-    st_ = kHasNumber;
-    v_.SetUint(u);
-    return true;
-  }
-
-  bool JsonParserHandler::Int64(int64_t i) {
-    st_ = kHasNumber;
-    v_.SetInt64(i);
-    return true;
-  }
-
-  bool JsonParserHandler::Uint64(uint64_t u) {
-    st_ = kHasNumber;
-    v_.SetUint64(u);
-    return true;
-  }
-
-  bool JsonParserHandler::Double(double d) {
-    st_ = kHasNumber;
-    v_.SetDouble(d);
-    return true;
-  }
-
-  bool JsonParserHandler::RawNumber(const char *, SizeType, bool) { return false; }
-
-  bool JsonParserHandler::String(const char *str, SizeType length, bool) {
-    st_ = kHasString;
-    v_.SetString(str, length);
-    return true;
-  }
-
-  bool JsonParserHandler::StartObject() {
-    st_ = kEnteringObject;
-    return true;
-  }
-
-  bool JsonParserHandler::Key(const char *str, SizeType length, bool) {
-    st_ = kHasKey;
-    v_.SetString(str, length);
-    return true;
-  }
-
-  bool JsonParserHandler::EndObject(SizeType) {
-    st_ = kExitingObject;
-    return true;
-  }
-
-  bool JsonParserHandler::StartArray() {
-    st_ = kEnteringArray;
-    return true;
-  }
-
-  bool JsonParserHandler::EndArray(SizeType) {
-    st_ = kExitingArray;
-    return true;
-  }
-
-  JsonParserHandler::JsonParserHandler(char *str) : v_(), st_(kInit), r_(), ss_(str) {
-    r_.IterativeParseInit();
-    ParseNext();
-  }
-
-  void JsonParserHandler::ParseNext() {
-    if (r_.HasParseError()) {
-      st_ = kError;
-      return;
-    }
-
-    r_.IterativeParseNext<parseFlags>(ss_, *this);
-  }
-
-  bool JsonParser::EnterObject() {
-    if (st_ != kEnteringObject) {
-      st_ = kError;
-      return false;
-    }
-
-    ParseNext();
-    return true;
-  }
-
-  bool JsonParser::EnterArray() {
-    if (st_ != kEnteringArray) {
-      st_ = kError;
-      return false;
-    }
-
-    ParseNext();
-    return true;
-  }
-
-  const char *JsonParser::NextObjectKey() {
-    if (st_ == kHasKey) {
-      const char *result = v_.GetString();
-      ParseNext();
-      return result;
-    }
-
-    if (st_ != kExitingObject) {
-      st_ = kError;
-      return 0;
-    }
-
-    ParseNext();
-    return 0;
-  }
-
-  bool JsonParser::NextArrayValue() {
-    if (st_ == kExitingArray) {
-      ParseNext();
-      return false;
-    }
-
-    if (st_ == kError || st_ == kExitingObject || st_ == kHasKey) {
-      st_ = kError;
-      return false;
-    }
-
-    return true;
-  }
-
-  int JsonParser::GetInt() {
-    if (st_ != kHasNumber || !v_.IsInt()) {
-      st_ = kError;
-      return 0;
-    }
-
-    int result = v_.GetInt();
-    ParseNext();
-    return result;
-  }
-
-  double JsonParser::GetDouble() {
-    if (st_ != kHasNumber) {
-      st_ = kError;
-      return 0.;
-    }
-
-    double result = v_.GetDouble();
-    ParseNext();
-    return result;
-  }
-
-  bool JsonParser::GetBool() {
-    if (st_ != kHasBool) {
-      st_ = kError;
-      return false;
-    }
-
-    bool result = v_.GetBool();
-    ParseNext();
-    return result;
-  }
-
-  void JsonParser::GetNull() {
-    if (st_ != kHasNull) {
-      st_ = kError;
-      return;
-    }
-
-    ParseNext();
-  }
-
-  const char *JsonParser::GetString() {
-    if (st_ != kHasString) {
-      st_ = kError;
-      return 0;
-    }
-
-    const char *temp = v_.GetString();
-    int len = v_.GetStringLength();
-    char *result = new char[len + 1];
-    strcpy(result, temp);
-    result[len] = '\0';
-    ParseNext();
-    return result;
-  }
-
-  const std::string JsonParser::GetObjectStr() {
-      std::string temp = "{";
-      temp.append(Stringify());
-      int endIndex = GetSplitIndex(temp, "{", "}");
-      SkipValue();
-      return temp.substr(0, endIndex + 1);
-  }
-
-  const std::string JsonParser::GetArrayStr() {
-      std::string temp = "[";
-      temp.append(Stringify());
-      int endIndex = GetSplitIndex(temp, "[", "]");
-      SkipValue();
-      return temp.substr(0, endIndex + 1);
-  }
-
-  const char *JsonParser::Stringify() {
-    return ss_.src_;
-  }
-
-  void JsonParser::SkipOut(int depth) {
-    do {
-      if (st_ == kEnteringArray || st_ == kEnteringObject) {
-        ++depth;
-      } else if (st_ == kExitingArray || st_ == kExitingObject) {
-        --depth;
-      } else if (st_ == kError) {
-        return;
-      }
-
-      ParseNext();
-    } while (depth > 0);
-  }
-
-  void JsonParser::SkipValue() {
-    SkipOut(0);
-  }
-
-  void JsonParser::SkipArray() {
-    SkipOut(1);
-  }
-
-  void JsonParser::SkipObject() {
-    SkipOut(1);
-  }
-
-  Value *JsonParser::PeekValue() {
-    if (st_ >= kHasNull && st_ <= kHasKey) {
-      return &v_;
-    }
-
-    return 0;
-  }
-
-  int JsonParser::PeekType() {
-    if (st_ >= kHasNull && st_ <= kHasKey) {
-      return v_.GetType();
-    }
-
-    if (st_ == kEnteringArray) {
-      return kArrayType;
-    }
-
-    if (st_ == kEnteringObject) {
-      return kObjectType;
-    }
-
-    return -1;
-  }
-
-  RenderObject *
-  ParseJsonObject(JsonParser &r, RenderObject *parent, int index, const std::string &pageId) {
-
-    RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-    r.EnterObject();
-
-    RenderObject *render;
-    std::string ref;
-
-    while (const char *key = r.NextObjectKey()) {
-
-      if (0 == strcmp(key, "ref")) {
-        RAPIDJSON_ASSERT(r.PeekType() == kStringType);
-        const char *temp_ref = r.GetString();
-        ref = temp_ref;
-        if (temp_ref != nullptr) {
-          delete[]temp_ref;
-          temp_ref = nullptr;
-        }
-      } else if (0 == strcmp(key, "type")) {
-        RAPIDJSON_ASSERT(r.PeekType() == kStringType);
-        const char *temp_type = r.GetString();
-        render = (RenderObject *) RenderCreator::GetInstance()->CreateRender(temp_type, ref);
-        render->SetPageId(pageId);
-        if (parent != nullptr)
-          parent->AddRenderObject(index, render);
-        if (temp_type != nullptr) {
-          delete[]temp_type;
-          temp_type = nullptr;
-        }
-      } else if (0 == strcmp(key, "attr") || 0 == strcmp(key, "style")) {
-        RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-        r.EnterObject();
-        while (const char *key2 = r.NextObjectKey()) {
-          if (r.PeekType() == kNumberType) {
-            RAPIDJSON_ASSERT(r.PeekType() == kNumberType);
-            if (0 == strcmp(key, "attr")) {
-              render->AddAttr(key2, to_string(r.GetDouble()));
-            } else if (0 == strcmp(key, "style")) {
-              render->AddStyle(key2, to_string(r.GetDouble()));
-            }
-          } else if (r.PeekType() == kStringType) {
-            RAPIDJSON_ASSERT(r.PeekType() == kStringType);
-            const char *temp_str = r.GetString();
-            if (0 == strcmp(key, "attr")) {
-              render->AddAttr(key2, temp_str);
-            } else if (0 == strcmp(key, "style")) {
-              render->AddStyle(key2, temp_str);
-            }
-            if (temp_str != nullptr) {
-              delete[]temp_str;
-              temp_str = nullptr;
-            }
-          } else if (r.PeekType() == kArrayType) {
-            RAPIDJSON_ASSERT(r.PeekType() == kArrayType);
-            std::string value = r.GetArrayStr();
-            if (0 == strcmp(key, "attr")) {
-              render->AddAttr(key2, value);
-            } else if (0 == strcmp(key, "style")) {
-              render->AddStyle(key2, value);
-            }
-          } else if (r.PeekType() == kTrueType) {
-            RAPIDJSON_ASSERT(r.PeekType() == kTrueType);
-            if (0 == strcmp(key, "attr")) {
-              render->AddAttr(key2, "true");
-            } else if (0 == strcmp(key, "style")) {
-              render->AddStyle(key2, "true");
-            }
-            r.SkipValue();
-          } else if (r.PeekType() == kFalseType) {
-            RAPIDJSON_ASSERT(r.PeekType() == kFalseType);
-            if (0 == strcmp(key, "attr")) {
-              render->AddAttr(key2, "false");
-            } else if (0 == strcmp(key, "style")) {
-              render->AddStyle(key2, "false");
-            }
-            r.SkipValue();
-          } else if (r.PeekType() == kObjectType) {
-            RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-            std::string value = r.GetObjectStr();
-            if (0 == strcmp(key, "attr")) {
-              render->AddAttr(key2, value);
-            } else if (0 == strcmp(key, "style")) {
-              render->AddStyle(key2, value);
-            }
-          } else {
-            r.SkipValue();
-          }
-        }
-      } else if (0 == strcmp(key, "event")) {
-          if (r.PeekType() == kArrayType) {
-              RAPIDJSON_ASSERT(r.PeekType() == kArrayType);
-              r.EnterArray();
-              while (r.NextArrayValue()) {
-                  std::string temp_event_str;
-                  if(r.PeekType() == kStringType) {
-                      RAPIDJSON_ASSERT(r.PeekType() == kStringType);
-                      const char *temp_event = r.GetString();
-                      temp_event_str.append(temp_event);
-                      delete[]temp_event;
-                  } else if(r.PeekType() == kObjectType){
-                      RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-                      temp_event_str = r.GetObjectStr();
-                  } else {
-                      r.SkipValue();
-                  }
-
-                  if (temp_event_str.length() > 0) {
-                      render->AddEvent(temp_event_str);
-                  }
-              }
-          }
-
-      } else if (0 == strcmp(key, "children")) {
-        RAPIDJSON_ASSERT(r.PeekType() == kArrayType);
-        r.EnterArray();
-
-        int index = 0;
-
-        while (r.NextArrayValue()) {
-          RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-          ParseJsonObject(r, render, index, pageId);
-          index++;
-        }
-      } else {
-        r.SkipValue();
-      }
-    }
-
-    if (render != nullptr) {
-      render->ApplyDefaultStyle();
-      render->ApplyDefaultAttr();
-    }
-
-    return render;
-  }
-
-/**
- * Parse json data to RenderObject
- * @param data : json data (include ref/style/attr/event/children)
- * @param page : {@link RenderPage}
- * @return {@link RenderObject*}
- */
-  RenderObject *Json2RenderObject(char *data, const std::string &pageId) {
-    JsonParser r(data);
-    return ParseJsonObject(r, nullptr, 0, pageId);
-  }
-
-  std::vector<std::pair<std::string, std::string>> *Json2Pairs(char *data) {
-    std::vector<std::pair<std::string, std::string>> *pairs = nullptr;
-    JsonParser r(data);
-    RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-    r.EnterObject();
-    pairs = new std::vector<std::pair<std::string, std::string>>();
-    while (const char *key = r.NextObjectKey()) {
-      if (r.PeekType() == kNumberType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kNumberType);
-        std::pair<std::string, std::string> myPair(key, to_string(r.GetDouble()));
-        pairs->insert(pairs->end(), myPair);
-      } else if (r.PeekType() == kStringType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kStringType);
-        const char *value = r.GetString();
-        std::pair<std::string, std::string> myPair(key, value);
-        pairs->insert(pairs->end(), myPair);
-        if (value != nullptr) {
-          delete value;
-          value = nullptr;
-        }
-      } else if (r.PeekType() == kArrayType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kArrayType);
-        std::string value = r.GetArrayStr();
-        std::pair<std::string, std::string> myPair(key, value);
-        pairs->insert(pairs->end(), myPair);
-      } else if (r.PeekType() == kTrueType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kTrueType);
-        std::pair<std::string, std::string> myPair(key, "true");
-        pairs->insert(pairs->end(), myPair);
-        r.SkipValue();
-      } else if (r.PeekType() == kFalseType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kFalseType);
-        std::pair<std::string, std::string> myPair(key, "false");
-        pairs->insert(pairs->end(), myPair);
-        r.SkipValue();
-      } else if (r.PeekType() == kNullType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kNullType);
-        std::pair<std::string, std::string> myPair(key, "");
-        pairs->insert(pairs->end(), myPair);
-        r.SkipValue();
-      } else if (r.PeekType() == kObjectType) {
-        RAPIDJSON_ASSERT(r.PeekType() == kObjectType);
-        std::string value = r.GetObjectStr();
-        std::pair<std::string, std::string> myPair(key, value);
-        pairs->insert(pairs->end(), myPair);
-      } else {
-        r.SkipValue();
-      }
-    }
-    return pairs;
-  }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/parser/dom_parser.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/parser/dom_parser.h b/weex_core/Source/core/parser/dom_parser.h
deleted file mode 100644
index e5ae4be..0000000
--- a/weex_core/Source/core/parser/dom_parser.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#ifndef WEEX_JSON_TOOLS
-#define WEEX_JSON_TOOLS
-
-#include "rapidjson/pointer.h"
-#include <vector>
-#include <string>
-
-namespace WeexCore {
-
-  class RenderObject;
-
-  class RenderPage;
-
-/**
- * Use to handler json parser result
- */
-  class JsonParserHandler {
-  public:
-    bool Null();
-
-    bool Bool(bool b);
-
-    bool Int(int i);
-
-    bool Uint(unsigned u);
-
-    bool Int64(int64_t i);
-
-    bool Uint64(uint64_t u);
-
-    bool Double(double d);
-
-    bool RawNumber(const char *, rapidjson::SizeType, bool);
-
-    bool String(const char *str, rapidjson::SizeType length, bool);
-
-    bool StartObject();
-
-    bool Key(const char *str, rapidjson::SizeType length, bool);
-
-    bool EndObject(rapidjson::SizeType);
-
-    bool StartArray();
-
-    bool EndArray(rapidjson::SizeType);
-
-  protected:
-    JsonParserHandler(char *str);
-
-    void ParseNext();
-
-  protected:
-    enum JsonParsingState {
-      kInit,
-      kError,
-      kHasNull,
-      kHasBool,
-      kHasNumber,
-      kHasString,
-      kHasKey,
-      kEnteringObject,
-      kExitingObject,
-      kEnteringArray,
-      kExitingArray
-    };
-
-    rapidjson::Value v_;
-    JsonParsingState st_;
-    rapidjson::Reader r_;
-    rapidjson::InsituStringStream ss_;
-
-    static const int parseFlags = rapidjson::kParseDefaultFlags | rapidjson::kParseInsituFlag;
-  };
-
-/**
- * Use to parse json data
- */
-  class JsonParser : public JsonParserHandler {
-  public:
-    JsonParser(char *str) : JsonParserHandler(str) {}
-
-    bool EnterObject();
-
-    bool EnterArray();
-
-    const char *NextObjectKey();
-
-    bool NextArrayValue();
-
-    int GetInt();
-
-    double GetDouble();
-
-    const char *GetString();
-
-    const std::string GetObjectStr();
-
-    const std::string GetArrayStr();
-
-    const char *Stringify();
-
-    bool GetBool();
-
-    void GetNull();
-
-    void SkipObject();
-
-    void SkipArray();
-
-    void SkipValue();
-
-    rapidjson::Value *PeekValue();
-
-    int PeekType(); // returns a rapidjson::Type, or -1 for no value (at end of object/array)
-
-    bool IsValid() { return st_ != kError; }
-
-  protected:
-    void SkipOut(int depth);
-  };
-
-/**
- * Parse json data to RenderObject
- * @param data : json data (include ref/style/attr/event/children)
- * @param page : {@link RenderPage*}
- * @return {@link RenderObject*}
- */
-  RenderObject *Json2RenderObject(char *data, const std::string &pageId);
-
-  std::vector<std::pair<std::string, std::string>> *Json2Pairs(char *data);
-}
-
-#endif //WEEX_JSON_TOOLS

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/parser/dom_wson.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/parser/dom_wson.cpp b/weex_core/Source/core/parser/dom_wson.cpp
new file mode 100644
index 0000000..36ea3c3
--- /dev/null
+++ b/weex_core/Source/core/parser/dom_wson.cpp
@@ -0,0 +1,224 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//
+// Created by furture on 2018/5/15.
+//
+
+#include <jni.h>
+#include <core/render/node/render_object.h>
+#include <core/render/page/render_page.h>
+#include <core/render/node/factory/render_creator.h>
+#include "dom_wson.h"
+#include "wson/wson.h"
+#include "wson/wson_parser.h"
+
+namespace WeexCore {
+
+
+
+    inline bool  keys_order_as_expect(RenderObject *render, bool keyOrderRight){
+        return (render != nullptr && keyOrderRight);
+    }
+
+
+    /**
+     * parser wson to render object
+     * */
+    RenderObject *parserWson2RenderObject(wson_parser& parser, RenderObject *parent, int index, const std::string &pageId){
+        int objectType = parser.nextType();
+        if(!parser.isMap(objectType)){
+            parser.skipValue(objectType);
+            return nullptr;
+        }
+        /**
+         * because strem key order specified, so will cann't dependecy it's keys order,
+         * if key orders right parse one time, if not first parse ref type create render object
+         * then parse others attrs
+         * */
+        int size = parser.nextMapSize();
+        std::string ref;
+        std::string renderType;
+        RenderObject *render = nullptr;
+        int state = parser.getState();
+        bool keyOrderRight = true;
+        for(int i=0; i < size; i++){
+            std::string objectKey = parser.nextMapKeyUTF8();
+            if(0 == strcmp(objectKey.c_str(), "ref")){
+                 ref = parser.nextStringUTF8(parser.nextType());
+            }else if (0 == strcmp(objectKey.c_str(), "type")) {
+                renderType = parser.nextStringUTF8(parser.nextType());
+                render = (RenderObject *) RenderCreator::GetInstance()->CreateRender(renderType, ref);
+                render->SetPageId(pageId);
+                if (parent != nullptr){
+                    parent->AddRenderObject(index, render);
+                }
+            }else if (0 == strcmp(objectKey.c_str(), "attr")){ //attr is map object
+                uint8_t attrType = parser.nextType();
+                if(parser.isMap(attrType) && keys_order_as_expect(render, keyOrderRight)){
+                    int attrMapSize = parser.nextMapSize();
+                    for(int attrIndex=0; attrIndex<attrMapSize; attrIndex++){
+                        std::string attrKeyString = parser.nextMapKeyUTF8();
+                        std::string attrValueString = parser.nextStringUTF8(parser.nextType());
+                        render->AddAttr(attrKeyString, attrValueString);
+                    }
+                }else{
+                    keyOrderRight = keys_order_as_expect(render, keyOrderRight);
+                    parser.skipValue(attrType);
+                }
+            }else if (0 == strcmp(objectKey.c_str(), "style")){ //style is map object
+                uint8_t styleType = parser.nextType();
+                if(parser.isMap(styleType) && keys_order_as_expect(render, keyOrderRight)){
+                    int styleMapSize = parser.nextMapSize();
+                    for(int styleIndex=0; styleIndex<styleMapSize; styleIndex++){
+                        std::string styleKeyString = parser.nextMapKeyUTF8();
+                        std::string styleValueString = parser.nextStringUTF8(parser.nextType());
+                        render->AddStyle(styleKeyString, styleValueString);
+                    }
+                }else{
+                    keyOrderRight = keys_order_as_expect(render, keyOrderRight);
+                    parser.skipValue(styleType);
+                }
+            }else if (0 == strcmp(objectKey.c_str(), "event")) {//event is array
+                uint8_t  eventType = parser.nextType();
+                if(parser.isArray(eventType) && keys_order_as_expect(render, keyOrderRight)){
+                    int eventSize = parser.nextArraySize();
+                    for(int eventIndex=0; eventIndex < eventSize; eventIndex++){
+                        std::string eventValue = parser.nextStringUTF8(parser.nextType());
+                        if(eventValue.size() > 0){
+                            render->AddEvent(eventValue);
+                        }
+                    }
+                }else{
+                    keyOrderRight = keys_order_as_expect(render, keyOrderRight);
+                    parser.skipValue(eventType);
+                }
+            }else if (0 == strcmp(objectKey.c_str(), "children")) {
+                uint8_t  childType = parser.nextType();
+                if(parser.isArray(childType) && keys_order_as_expect(render, keyOrderRight)){
+                    int childSize = parser.nextArraySize();
+                    for(int childIndex=0; childIndex < childSize; childIndex++){
+                        parserWson2RenderObject(parser, render, childIndex, pageId);
+                    }
+                }else{
+                    keyOrderRight = keys_order_as_expect(render, keyOrderRight);
+                    parser.skipValue(childType);
+                }
+            }else{
+                parser.skipValue(parser.nextType());
+            }
+        }
+
+        /**
+         * if key order not right, parse attr&style  events children again
+         * */
+        if(!keyOrderRight && render != nullptr){
+            parser.restoreToState(state);
+            for(int i=0; i < size; i++){
+                std::string objectKey = parser.nextMapKeyUTF8();
+                if (0 == strcmp(objectKey.c_str(), "attr")){ //attr is map object
+                    uint8_t attrType = parser.nextType();
+                    if(parser.isMap(attrType)){
+                        int attrMapSize = parser.nextMapSize();
+                        for(int attrIndex=0; attrIndex<attrMapSize; attrIndex++){
+                            std::string attrKeyString = parser.nextMapKeyUTF8();
+                            std::string attrValueString = parser.nextStringUTF8(parser.nextType());
+                            render->AddAttr(attrKeyString, attrValueString);
+                        }
+                    }else{
+                        parser.skipValue(attrType);
+                    }
+                }else if (0 == strcmp(objectKey.c_str(), "style")){ //style is map object
+                    uint8_t styleType = parser.nextType();
+                    if(parser.isMap(styleType)){
+                        int styleMapSize = parser.nextMapSize();
+                        for(int styleIndex=0; styleIndex<styleMapSize; styleIndex++){
+                            std::string styleKeyString = parser.nextMapKeyUTF8();
+                            std::string styleValueString = parser.nextStringUTF8(parser.nextType());
+                            render->AddStyle(styleKeyString, styleValueString);
+                        }
+                    }else{
+                        parser.skipValue(styleType);
+                    }
+                }else if (0 == strcmp(objectKey.c_str(), "event")) {//event is array
+                    uint8_t  eventType = parser.nextType();
+                    if(parser.isArray(eventType)){
+                        int eventSize = parser.nextArraySize();
+                        for(int eventIndex=0; eventIndex < eventSize; eventIndex++){
+                            std::string eventValue = parser.nextStringUTF8(parser.nextType());
+                            if(eventValue.size() > 0){
+                                render->AddEvent(eventValue);
+                            }
+                        }
+                    }else{;
+                        parser.skipValue(eventType);
+                    }
+                }else if (0 == strcmp(objectKey.c_str(), "children")) {
+                    uint8_t  childType = parser.nextType();
+                    if(parser.isArray(childType)){
+                        int childSize = parser.nextArraySize();
+                        for(int childIndex=0; childIndex < childSize; childIndex++){
+                            parserWson2RenderObject(parser, render, childIndex, pageId);
+                        }
+                    }else{
+                        parser.skipValue(childType);
+                    }
+                }else{
+                    parser.skipValue(parser.nextType());
+                }
+            }
+        }
+
+
+        if (render != nullptr) {
+            render->ApplyDefaultStyle();
+            render->ApplyDefaultAttr();
+        }
+        return render;
+    }
+
+
+    RenderObject *Wson2RenderObject(const char *data, const std::string &pageId){
+        if(!data){
+            return nullptr;
+        }
+        wson_parser parser(data);
+        return parserWson2RenderObject(parser, nullptr, 0, pageId);
+    }
+
+    std::vector<std::pair<std::string, std::string>> *Wson2Pairs(const char *data){
+        if(!data){
+            return nullptr;
+        }
+        wson_parser parser(data);
+        std::vector<std::pair<std::string, std::string>> *pairs = nullptr;
+        uint8_t  type = parser.nextType();
+        if(parser.isMap(type)){
+            pairs = new std::vector<std::pair<std::string, std::string>>();
+            int mapSize = parser.nextMapSize();
+            for(int index=0; index < mapSize; index++){
+                std::string mapKeyString = parser.nextMapKeyUTF8();
+                std::string mapValueString = parser.nextStringUTF8(parser.nextType());
+                std::pair<std::string, std::string> mapPair(mapKeyString, mapValueString);
+                pairs->insert(pairs->end(), mapPair);
+            }
+        }
+        return pairs;
+    };
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/parser/dom_wson.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/parser/dom_wson.h b/weex_core/Source/core/parser/dom_wson.h
new file mode 100644
index 0000000..4574ad3
--- /dev/null
+++ b/weex_core/Source/core/parser/dom_wson.h
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//
+// Created by furture on 2018/5/15.
+//
+
+#ifndef WEEX_PROJECT_WSON_PARSER_H
+#define WEEX_PROJECT_WSON_PARSER_H
+
+#include <vector>
+#include <string>
+
+
+namespace WeexCore {
+
+    class RenderObject;
+    class RenderPage;
+
+    RenderObject *Wson2RenderObject(const char *data, const std::string &pageId);
+    std::vector<std::pair<std::string, std::string>> *Wson2Pairs(const char *data);
+}
+
+
+
+
+#endif //WEEX_PROJECT_WSON_PARSER_H

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/render/manager/render_manager.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/manager/render_manager.cpp b/weex_core/Source/core/render/manager/render_manager.cpp
index 0429233..d271b14 100644
--- a/weex_core/Source/core/render/manager/render_manager.cpp
+++ b/weex_core/Source/core/render/manager/render_manager.cpp
@@ -16,28 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <core/parser/dom_parser.h>
 #include <core/render/manager/render_manager.h>
 #include <core/render/page/render_page.h>
 #include <core/render/node/render_object.h>
 #include <base/TimeUtils.h>
+#include <core/parser/dom_wson.h>
 
 namespace WeexCore {
 
   RenderManager *RenderManager::m_pInstance = nullptr;
 
-  bool RenderManager::CreatePage(std::string pageId, const std::string &data) {
+  bool RenderManager::CreatePage(std::string pageId, const  char* data) {
 
 #if RENDER_LOG
-    LOGD("[RenderManager] CreatePage >>>> pageId: %s, dom data: %s", pageId.c_str(), data.c_str());
+    wson_parser parser(data);
+    LOGD("[RenderManager] CreatePage >>>> pageId: %s, dom data: %s", pageId.c_str(), parser.toStringUTF8().c_str());
 #endif
 
     RenderPage *page = new RenderPage(pageId);
     mPages.insert(std::pair<std::string, RenderPage *>(pageId, page));
 
     long long startTime = getCurrentTime();
-    char *c_data = (char *) data.data();
-    RenderObject *root = Json2RenderObject(c_data, pageId);
+    RenderObject *root = Wson2RenderObject(data, pageId);
     page->ParseJsonTime(getCurrentTime() - startTime);
 
     page->updateDirty(true);
@@ -45,20 +45,20 @@ namespace WeexCore {
   }
 
   bool RenderManager::AddRenderObject(const std::string &pageId, const std::string &parentRef,
-                                      int index, const std::string &data) {
+                                      int index, const char* data) {
 
     RenderPage *page = GetPage(pageId);
     if (page == nullptr)
       return false;
 
 #if RENDER_LOG
+    wson_parser parser(data);
     LOGD("[RenderManager] AddRenderObject >>>> pageId: %s, parentRef: %s, index: %d, dom data: %s",
-         pageId.c_str(), parentRef.c_str(), index, data.c_str());
+         pageId.c_str(), parentRef.c_str(), index, parser.toStringUTF8().c_str());
 #endif
 
     long long startTime = getCurrentTime();
-    char *c_data = (char *) data.data();
-    RenderObject *child = Json2RenderObject(c_data, pageId);
+    RenderObject *child = Wson2RenderObject(data, pageId);
     page->ParseJsonTime(getCurrentTime() - startTime);
 
     if (child == nullptr)
@@ -99,19 +99,19 @@ namespace WeexCore {
   }
 
   bool RenderManager::UpdateAttr(const std::string &pageId, const std::string &ref,
-                                 const std::string &data) {
+                                 const char* data) {
     RenderPage *page = this->GetPage(pageId);
     if (page == nullptr)
       return false;
 
 #if RENDER_LOG
+    wson_parser parser(data);
     LOGD("[RenderManager] UpdateAttr >>>> pageId: %s, ref: %s, data: %s",
-         pageId.c_str(), ref.c_str(), data.c_str());
+         pageId.c_str(), ref.c_str(), parser.toStringUTF8().c_str());
 #endif
 
     long long startTime = getCurrentTime();
-    char *c_data = (char *) data.data();
-    std::vector<std::pair<std::string, std::string>> *attrs = Json2Pairs(c_data);
+    std::vector<std::pair<std::string, std::string>> *attrs = Wson2Pairs(data);
     page->ParseJsonTime(getCurrentTime() - startTime);
 
     page->updateDirty(true);
@@ -119,19 +119,19 @@ namespace WeexCore {
   }
 
   bool RenderManager::UpdateStyle(const std::string &pageId, const std::string &ref,
-                                  const std::string &data) {
+                                  const char* data) {
     RenderPage *page = this->GetPage(pageId);
     if (page == nullptr)
       return false;
 
 #if RENDER_LOG
+    wson_parser parser(data);
     LOGD("[RenderManager] UpdateStyle >>>> pageId: %s, ref: %s, data: %s",
-         pageId.c_str(), ref.c_str(), data.c_str());
+         pageId.c_str(), ref.c_str(), parser.toStringUTF8().c_str());
 #endif
 
     long long startTime = getCurrentTime();
-    char *c_data = (char *) data.data();
-    std::vector<std::pair<std::string, std::string>> *styles = Json2Pairs(c_data);
+    std::vector<std::pair<std::string, std::string>> *styles = Wson2Pairs(data);
     page->ParseJsonTime(getCurrentTime() - startTime);
 
     page->updateDirty(true);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/render/manager/render_manager.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/manager/render_manager.h b/weex_core/Source/core/render/manager/render_manager.h
index fdcd943..fb91605 100644
--- a/weex_core/Source/core/render/manager/render_manager.h
+++ b/weex_core/Source/core/render/manager/render_manager.h
@@ -21,6 +21,7 @@
 
 #include <map>
 #include <string>
+#include <stdbool.h>
 
 namespace WeexCore {
 
@@ -50,10 +51,11 @@ namespace WeexCore {
     void Batch(const std::string &pageId);
 
     // create root node
-    bool CreatePage(std::string pageId, const std::string &data);
+    bool CreatePage(std::string pageId, const char* data);
 
+    /** use auto constructor is bad idea, it cann't transfer binary, use char* is better */
     bool AddRenderObject(const std::string &pageId, const std::string &parentRef, int index,
-                         const std::string &data);
+                         const char* data);
 
     bool RemoveRenderObject(const std::string &pageId, const std::string &ref);
 
@@ -61,9 +63,9 @@ namespace WeexCore {
     MoveRenderObject(const std::string &pageId, const std::string &ref,
                      const std::string &parentRef, int index);
 
-    bool UpdateAttr(const std::string &pageId, const std::string &ref, const std::string &data);
+    bool UpdateAttr(const std::string &pageId, const std::string &ref, const char* data);
 
-    bool UpdateStyle(const std::string &pageId, const std::string &ref, const std::string &data);
+    bool UpdateStyle(const std::string &pageId, const std::string &ref, const char* data);
 
     bool AddEvent(const std::string &pageId, const std::string &ref, const std::string &event);
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/core/render/page/render_page.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp
index cb10636..5575692 100644
--- a/weex_core/Source/core/render/page/render_page.cpp
+++ b/weex_core/Source/core/render/page/render_page.cpp
@@ -16,7 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-#include <core/parser/dom_parser.h>
 #include <core/render/action/render_action_add_element.h>
 #include <core/render/action/render_action_remove_element.h>
 #include <core/render/action/render_action_move_element.h>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/include/WeexApiHeader.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/include/WeexApiHeader.h b/weex_core/Source/include/WeexApiHeader.h
index dfb40ec..e624458 100644
--- a/weex_core/Source/include/WeexApiHeader.h
+++ b/weex_core/Source/include/WeexApiHeader.h
@@ -37,6 +37,27 @@ struct WeexByteArray {
     char content[1];
 };
 
+struct WeexJSResult{
+    char* data = nullptr;
+    int  length = 0;
+    bool fromMalloc = false;
+    bool fromNew = false;
+};
+
+inline void WeexJSResultDataFree(WeexJSResult& result){
+    if(result.fromMalloc){
+        free(result.data);
+        return;
+    }
+    if(result.fromNew){
+        delete[] result.data;
+        return;
+    }
+}
+
+
+
+
 typedef void (*FuncSetJSVersion)(const char *jsVersion);
 
 typedef void (*FuncReportException)(const char *pageId, const char *func,
@@ -46,12 +67,13 @@ typedef void (*FuncCallNative)(const char *pageId, const char *task, const char
 
 typedef std::unique_ptr<IPCResult> (*FuncCallNativeModule)(const char *pageId, const char *module,
                                                            const char *method,
-                                                           const char *argString,
-                                                           const char *optString);
+                                                           const char *arguments,
+                                                           int argumentsLength,
+                                                           const char *options,
+                                                           int optionsLength);
 
-typedef void (*FuncCallNativeComponent)(const char *pageId, const char *ref,
-                                        const char *method, const char *argString,
-                                        const char *optString);
+typedef void (*FuncCallNativeComponent)(const char *pageId, const char *ref, const char *method,
+                                        const char *arguments, int argumentsLength, const char *options, int optionsLength);
 
 typedef void (*FuncCallAddElement)(const char *pageId, const char *parentRef, const char *domStr,
                                    const char *index_cstr);
@@ -180,7 +202,7 @@ typedef int (*FuncExeCTimeCallback)(const char *source);
 typedef int (*FuncExeJS)(const char *instanceId, const char *nameSpace, const char *func,
                          std::vector<VALUE_WITH_TYPE *> params);
 
-typedef char *(*FuncExeJSWithResult)(const char *instanceId, const char *nameSpace,
+typedef WeexJSResult(*FuncExeJSWithResult)(const char *instanceId, const char *nameSpace,
                                      const char *func,
                                      std::vector<VALUE_WITH_TYPE *> params);
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/rapidjson/allocators.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/rapidjson/allocators.h b/weex_core/Source/rapidjson/allocators.h
deleted file mode 100644
index 655f4a3..0000000
--- a/weex_core/Source/rapidjson/allocators.h
+++ /dev/null
@@ -1,271 +0,0 @@
-// Tencent is pleased to support the open source community by making RapidJSON available.
-// 
-// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-//
-// Licensed under the MIT License (the "License"); you may not use this file except
-// in compliance with the License. You may obtain a copy of the License at
-//
-// http://opensource.org/licenses/MIT
-//
-// Unless required by applicable law or agreed to in writing, software distributed 
-// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
-// CONDITIONS OF ANY KIND, either express or implied. See the License for the 
-// specific language governing permissions and limitations under the License.
-
-#ifndef RAPIDJSON_ALLOCATORS_H_
-#define RAPIDJSON_ALLOCATORS_H_
-
-#include "rapidjson.h"
-
-RAPIDJSON_NAMESPACE_BEGIN
-
-///////////////////////////////////////////////////////////////////////////////
-// Allocator
-
-/*! \class rapidjson::Allocator
-    \brief Concept for allocating, resizing and freeing memory block.
-    
-    Note that Malloc() and Realloc() are non-static but Free() is static.
-    
-    So if an allocator need to support Free(), it needs to put its pointer in 
-    the header of memory block.
-
-\code
-concept Allocator {
-    static const bool kNeedFree;    //!< Whether this allocator needs to call Free().
-
-    // Allocate a memory block.
-    // \param size of the memory block in bytes.
-    // \returns pointer to the memory block.
-    void* Malloc(size_t size);
-
-    // Resize a memory block.
-    // \param originalPtr The pointer to current memory block. Null pointer is permitted.
-    // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.)
-    // \param newSize the new size in bytes.
-    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize);
-
-    // Free a memory block.
-    // \param pointer to the memory block. Null pointer is permitted.
-    static void Free(void *ptr);
-};
-\endcode
-*/
-
-///////////////////////////////////////////////////////////////////////////////
-// CrtAllocator
-
-//! C-runtime library allocator.
-/*! This class is just wrapper for standard C library memory routines.
-    \note implements Allocator concept
-*/
-class CrtAllocator {
-public:
-    static const bool kNeedFree = true;
-    void* Malloc(size_t size) { 
-        if (size) //  behavior of malloc(0) is implementation defined.
-            return std::malloc(size);
-        else
-            return NULL; // standardize to returning NULL.
-    }
-    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
-        (void)originalSize;
-        if (newSize == 0) {
-            std::free(originalPtr);
-            return NULL;
-        }
-        return std::realloc(originalPtr, newSize);
-    }
-    static void Free(void *ptr) { std::free(ptr); }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// MemoryPoolAllocator
-
-//! Default memory allocator used by the parser and DOM.
-/*! This allocator allocate memory blocks from pre-allocated memory chunks. 
-
-    It does not free memory blocks. And Realloc() only allocate new memory.
-
-    The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default.
-
-    User may also supply a buffer as the first chunk.
-
-    If the user-buffer is full then additional chunks are allocated by BaseAllocator.
-
-    The user-buffer is not deallocated by this allocator.
-
-    \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator.
-    \note implements Allocator concept
-*/
-template <typename BaseAllocator = CrtAllocator>
-class MemoryPoolAllocator {
-public:
-    static const bool kNeedFree = false;    //!< Tell users that no need to call Free() with this allocator. (concept Allocator)
-
-    //! Constructor with chunkSize.
-    /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize.
-        \param baseAllocator The allocator for allocating memory chunks.
-    */
-    MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : 
-        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
-    {
-    }
-
-    //! Constructor with user-supplied buffer.
-    /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size.
-
-        The user buffer will not be deallocated when this allocator is destructed.
-
-        \param buffer User supplied buffer.
-        \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader).
-        \param chunkSize The size of memory chunk. The default is kDefaultChunkSize.
-        \param baseAllocator The allocator for allocating memory chunks.
-    */
-    MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) :
-        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
-    {
-        RAPIDJSON_ASSERT(buffer != 0);
-        RAPIDJSON_ASSERT(size > sizeof(ChunkHeader));
-        chunkHead_ = reinterpret_cast<ChunkHeader*>(buffer);
-        chunkHead_->capacity = size - sizeof(ChunkHeader);
-        chunkHead_->size = 0;
-        chunkHead_->next = 0;
-    }
-
-    //! Destructor.
-    /*! This deallocates all memory chunks, excluding the user-supplied buffer.
-    */
-    ~MemoryPoolAllocator() {
-        Clear();
-        RAPIDJSON_DELETE(ownBaseAllocator_);
-    }
-
-    //! Deallocates all memory chunks, excluding the user-supplied buffer.
-    void Clear() {
-        while (chunkHead_ && chunkHead_ != userBuffer_) {
-            ChunkHeader* next = chunkHead_->next;
-            baseAllocator_->Free(chunkHead_);
-            chunkHead_ = next;
-        }
-        if (chunkHead_ && chunkHead_ == userBuffer_)
-            chunkHead_->size = 0; // Clear user buffer
-    }
-
-    //! Computes the total capacity of allocated memory chunks.
-    /*! \return total capacity in bytes.
-    */
-    size_t Capacity() const {
-        size_t capacity = 0;
-        for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
-            capacity += c->capacity;
-        return capacity;
-    }
-
-    //! Computes the memory blocks allocated.
-    /*! \return total used bytes.
-    */
-    size_t Size() const {
-        size_t size = 0;
-        for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
-            size += c->size;
-        return size;
-    }
-
-    //! Allocates a memory block. (concept Allocator)
-    void* Malloc(size_t size) {
-        if (!size)
-            return NULL;
-
-        size = RAPIDJSON_ALIGN(size);
-        if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity)
-            if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size))
-                return NULL;
-
-        void *buffer = reinterpret_cast<char *>(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size;
-        chunkHead_->size += size;
-        return buffer;
-    }
-
-    //! Resizes a memory block (concept Allocator)
-    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
-        if (originalPtr == 0)
-            return Malloc(newSize);
-
-        if (newSize == 0)
-            return NULL;
-
-        originalSize = RAPIDJSON_ALIGN(originalSize);
-        newSize = RAPIDJSON_ALIGN(newSize);
-
-        // Do not shrink if new size is smaller than original
-        if (originalSize >= newSize)
-            return originalPtr;
-
-        // Simply expand it if it is the last allocation and there is sufficient space
-        if (originalPtr == reinterpret_cast<char *>(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) {
-            size_t increment = static_cast<size_t>(newSize - originalSize);
-            if (chunkHead_->size + increment <= chunkHead_->capacity) {
-                chunkHead_->size += increment;
-                return originalPtr;
-            }
-        }
-
-        // Realloc process: allocate and copy memory, do not free original buffer.
-        if (void* newBuffer = Malloc(newSize)) {
-            if (originalSize)
-                std::memcpy(newBuffer, originalPtr, originalSize);
-            return newBuffer;
-        }
-        else
-            return NULL;
-    }
-
-    //! Frees a memory block (concept Allocator)
-    static void Free(void *ptr) { (void)ptr; } // Do nothing
-
-private:
-    //! Copy constructor is not permitted.
-    MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */;
-    //! Copy assignment operator is not permitted.
-    MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */;
-
-    //! Creates a new chunk.
-    /*! \param capacity Capacity of the chunk in bytes.
-        \return true if success.
-    */
-    bool AddChunk(size_t capacity) {
-        if (!baseAllocator_)
-            ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)();
-        if (ChunkHeader* chunk = reinterpret_cast<ChunkHeader*>(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) {
-            chunk->capacity = capacity;
-            chunk->size = 0;
-            chunk->next = chunkHead_;
-            chunkHead_ =  chunk;
-            return true;
-        }
-        else
-            return false;
-    }
-
-    static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity.
-
-    //! Chunk header for perpending to each chunk.
-    /*! Chunks are stored as a singly linked list.
-    */
-    struct ChunkHeader {
-        size_t capacity;    //!< Capacity of the chunk in bytes (excluding the header itself).
-        size_t size;        //!< Current size of allocated memory in bytes.
-        ChunkHeader *next;  //!< Next chunk in the linked list.
-    };
-
-    ChunkHeader *chunkHead_;    //!< Head of the chunk linked-list. Only the head chunk serves allocation.
-    size_t chunk_capacity_;     //!< The minimum capacity of chunk when they are allocated.
-    void *userBuffer_;          //!< User supplied buffer.
-    BaseAllocator* baseAllocator_;  //!< base allocator for allocating memory chunks.
-    BaseAllocator* ownBaseAllocator_;   //!< base allocator created by this object.
-};
-
-RAPIDJSON_NAMESPACE_END
-
-#endif // RAPIDJSON_ENCODINGS_H_