diff --git a/pom.xml b/pom.xml
index b3f817c0..29fab04d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.jsoniter
- 0.9.23
+ 0.9.24-SNAPSHOT
jsoniter
json iterator
jsoniter (json-iterator) is fast and flexible JSON parser available in Java and Go
@@ -155,6 +155,7 @@
+
org.apache.maven.plugins
maven-gpg-plugin
@@ -169,6 +170,7 @@
+
org.sonatype.plugins
nexus-staging-maven-plugin
diff --git a/src/main/java/com/jsoniter/output/CodegenImplObject.java b/src/main/java/com/jsoniter/output/CodegenImplObject.java
index 2e07f651..b2f03c88 100644
--- a/src/main/java/com/jsoniter/output/CodegenImplObject.java
+++ b/src/main/java/com/jsoniter/output/CodegenImplObject.java
@@ -12,41 +12,57 @@ public static CodegenResult genObject(ClassInfo classInfo) {
List encodeTos = desc.encodeTos();
ctx.append(String.format("public static void encode_(%s obj, com.jsoniter.output.JsonStream stream) throws java.io.IOException {", classInfo.clazz.getCanonicalName()));
if (hasFieldOutput(desc)) {
- int notFirst = 0;
- if (noIndention) {
- ctx.buffer('{');
- } else {
- ctx.append("stream.writeObjectStart();");
+ boolean isSimpleValue = false;
+ for(UnwrapperDescriptor unwarpper: desc.unwrappers) {
+ if (unwarpper.isSimpleValue) {
+ isSimpleValue = true;
+ break;
+ }
}
- for (EncodeTo encodeTo : encodeTos) {
- notFirst = genField(ctx, encodeTo.binding, encodeTo.toName, notFirst);
+ if (isSimpleValue) {
+ UnwrapperDescriptor unwrapper = desc.unwrappers.get(0);
+ ctx.append(String.format("Object simpleValue = obj.%s();", unwrapper.method.getName()));
+ ctx.append("if (simpleValue == null) { stream.writeNull(); } else {");
+ CodegenImplNative.genWriteOp(ctx, "simpleValue", unwrapper.mapValueTypeLiteral.getType(), true);
+ ctx.append("}");
}
- for (UnwrapperDescriptor unwrapper : desc.unwrappers) {
- if (unwrapper.isMap) {
- ctx.append(String.format("java.util.Map map = (java.util.Map)obj.%s();", unwrapper.method.getName()));
- ctx.append("java.util.Iterator iter = map.entrySet().iterator();");
- ctx.append("while(iter.hasNext()) {");
- ctx.append("java.util.Map.Entry entry = (java.util.Map.Entry)iter.next();");
- notFirst = appendComma(ctx, notFirst);
- ctx.append("stream.writeObjectField(entry.getKey().toString());");
- ctx.append("if (entry.getValue() == null) { stream.writeNull(); } else {");
- CodegenImplNative.genWriteOp(ctx, "entry.getValue()", unwrapper.mapValueTypeLiteral.getType(), true);
- ctx.append("}");
- ctx.append("}");
+ else {
+ int notFirst = 0;
+ if (noIndention) {
+ ctx.buffer('{');
} else {
- notFirst = appendComma(ctx, notFirst);
- ctx.append(String.format("obj.%s(stream);", unwrapper.method.getName()));
+ ctx.append("stream.writeObjectStart();");
}
- }
- if (noIndention) {
- ctx.buffer('}');
- } else {
- if (notFirst == 1) { // definitely not first
- ctx.append("stream.writeObjectEnd();");
- } else if (notFirst == 2) { // // maybe not first, previous field is omitNull
- ctx.append("if (notFirst) { stream.writeObjectEnd(); } else { stream.write('}'); }");
- } else { // this is the first
- ctx.append("stream.write('}');");
+ for (EncodeTo encodeTo : encodeTos) {
+ notFirst = genField(ctx, encodeTo.binding, encodeTo.toName, notFirst);
+ }
+ for (UnwrapperDescriptor unwrapper : desc.unwrappers) {
+ if (unwrapper.isMap) {
+ ctx.append(String.format("java.util.Map map = (java.util.Map)obj.%s();", unwrapper.method.getName()));
+ ctx.append("java.util.Iterator iter = map.entrySet().iterator();");
+ ctx.append("while(iter.hasNext()) {");
+ ctx.append("java.util.Map.Entry entry = (java.util.Map.Entry)iter.next();");
+ notFirst = appendComma(ctx, notFirst);
+ ctx.append("stream.writeObjectField(entry.getKey().toString());");
+ ctx.append("if (entry.getValue() == null) { stream.writeNull(); } else {");
+ CodegenImplNative.genWriteOp(ctx, "entry.getValue()", unwrapper.mapValueTypeLiteral.getType(), true);
+ ctx.append("}");
+ ctx.append("}");
+ } else {
+ notFirst = appendComma(ctx, notFirst);
+ ctx.append(String.format("obj.%s(stream);", unwrapper.method.getName()));
+ }
+ }
+ if (noIndention) {
+ ctx.buffer('}');
+ } else {
+ if (notFirst == 1) { // definitely not first
+ ctx.append("stream.writeObjectEnd();");
+ } else if (notFirst == 2) { // // maybe not first, previous field is omitNull
+ ctx.append("if (notFirst) { stream.writeObjectEnd(); } else { stream.write('}'); }");
+ } else { // this is the first
+ ctx.append("stream.write('}');");
+ }
}
}
} else {
diff --git a/src/main/java/com/jsoniter/output/ReflectionObjectEncoder.java b/src/main/java/com/jsoniter/output/ReflectionObjectEncoder.java
index 99c256c3..ec5fea82 100644
--- a/src/main/java/com/jsoniter/output/ReflectionObjectEncoder.java
+++ b/src/main/java/com/jsoniter/output/ReflectionObjectEncoder.java
@@ -67,42 +67,56 @@ private void enocde_(Object obj, JsonStream stream) throws Exception {
stream.writeNull();
return;
}
- stream.writeObjectStart();
- boolean notFirst = false;
- for (EncodeTo encodeTo : fields) {
- Object val = encodeTo.binding.field.get(obj);
- notFirst = writeEncodeTo(stream, notFirst, encodeTo, val);
+ boolean isSimpleValue = false;
+ for(UnwrapperDescriptor unwarpper: desc.unwrappers) {
+ if (unwarpper.isSimpleValue) {
+ isSimpleValue = true;
+ break;
+ }
}
- for (EncodeTo encodeTo : getters) {
- Object val = encodeTo.binding.method.invoke(obj);
- notFirst = writeEncodeTo(stream, notFirst, encodeTo, val);
+ if (isSimpleValue) {
+ UnwrapperDescriptor unwrapper = desc.unwrappers.get(0);
+ Object simpleValue = unwrapper.method.invoke(obj);
+ stream.writeVal(unwrapper.mapValueTypeLiteral, simpleValue);
}
- for (UnwrapperDescriptor unwrapper : desc.unwrappers) {
- if (unwrapper.isMap) {
- Map