Skip to content

Commit

Permalink
add: JsonCallback,让用户可以自定义对象的toJson过程
Browse files Browse the repository at this point in the history
  • Loading branch information
wendal committed Aug 24, 2017
1 parent 5fae189 commit 10b5eb0
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 14 deletions.
12 changes: 12 additions & 0 deletions src/org/nutz/json/entity/JsonCallback.java
@@ -0,0 +1,12 @@
package org.nutz.json.entity;

import java.io.IOException;
import java.io.Writer;

import org.nutz.json.JsonFormat;
import org.nutz.lang.util.NutMap;

public interface JsonCallback {

boolean toJson(Object obj, JsonFormat jf, Writer writer, NutMap ctx) throws IOException;
}
38 changes: 37 additions & 1 deletion src/org/nutz/json/entity/JsonEntity.java
@@ -1,20 +1,25 @@
package org.nutz.json.entity; package org.nutz.json.entity;


import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

import org.nutz.json.Json; import org.nutz.json.Json;
import org.nutz.json.JsonEntityFieldMaker; import org.nutz.json.JsonEntityFieldMaker;
import org.nutz.json.JsonException;
import org.nutz.json.JsonFormat; import org.nutz.json.JsonFormat;
import org.nutz.json.ToJson; import org.nutz.json.ToJson;
import org.nutz.lang.Lang; import org.nutz.lang.Lang;
import org.nutz.lang.Mirror; import org.nutz.lang.Mirror;
import org.nutz.lang.Strings; import org.nutz.lang.Strings;
import org.nutz.lang.born.Borning; import org.nutz.lang.born.Borning;
import org.nutz.lang.born.BorningException; import org.nutz.lang.born.BorningException;
import org.nutz.lang.util.NutMap;


/** /**
* 记录一个Java如何映射 JSON 字符串的规则 * 记录一个Java如何映射 JSON 字符串的规则
Expand All @@ -36,6 +41,8 @@ public class JsonEntity {
private Method toJsonMethod; private Method toJsonMethod;


private JsonEntityFieldMaker fieldMaker; private JsonEntityFieldMaker fieldMaker;

private JsonCallback jsonCallback;


public JsonEntity(Mirror<?> mirror) { public JsonEntity(Mirror<?> mirror) {
fieldMaker = Json.getDefaultFieldMaker(); fieldMaker = Json.getDefaultFieldMaker();
Expand Down Expand Up @@ -90,6 +97,23 @@ public JsonEntity(Mirror<?> mirror) {
catch (Exception e) { catch (Exception e) {
throw Lang.wrapThrow(e); throw Lang.wrapThrow(e);
} }
if (toJsonMethod != null) {
final int paramCount = toJsonMethod.getParameterTypes().length;
jsonCallback = new JsonCallback() {
public boolean toJson(Object obj, JsonFormat jf, Writer writer, NutMap ctx) throws IOException {
try {
if (paramCount == 0)
writer.write((String)toJsonMethod.invoke(obj));
else
writer.write((String)toJsonMethod.invoke(obj, jf));
}
catch (Exception e) {
throw new JsonException(err);
}
return true;
}
};
}
} }


public List<JsonEntityField> getFields() { public List<JsonEntityField> getFields() {
Expand All @@ -106,8 +130,20 @@ public JsonEntityField getField(String name) {
return fieldMap.get(name); return fieldMap.get(name);
} }


public JsonCallback getJsonCallback() {
return jsonCallback;
}

public void setJsonCallback(JsonCallback jsonCallback) {
this.jsonCallback = jsonCallback;
}

public void setBorning(Borning<?> borning) {
this.borning = borning;
}

@Deprecated
public Method getToJsonMethod() { public Method getToJsonMethod() {
return toJsonMethod; return toJsonMethod;
} }

} }
17 changes: 4 additions & 13 deletions src/org/nutz/json/impl/JsonRenderImpl.java
Expand Up @@ -3,7 +3,6 @@
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.Format; import java.text.Format;
import java.util.ArrayList; import java.util.ArrayList;
Expand All @@ -24,6 +23,7 @@
import org.nutz.json.JsonShape; import org.nutz.json.JsonShape;
import org.nutz.json.entity.JsonEntity; import org.nutz.json.entity.JsonEntity;
import org.nutz.json.entity.JsonEntityField; import org.nutz.json.entity.JsonEntityField;
import org.nutz.json.entity.JsonCallback;
import org.nutz.lang.FailToGetValueException; import org.nutz.lang.FailToGetValueException;
import org.nutz.lang.Lang; import org.nutz.lang.Lang;
import org.nutz.lang.Mirror; import org.nutz.lang.Mirror;
Expand Down Expand Up @@ -261,19 +261,10 @@ private void pojo2Json(Object obj) throws IOException {
*/ */
Class<?> type = obj.getClass(); Class<?> type = obj.getClass();
JsonEntity jen = Json.getEntity(Mirror.me(type)); JsonEntity jen = Json.getEntity(Mirror.me(type));
Method toJsonMethod = jen.getToJsonMethod(); JsonCallback jsonCallback = jen.getJsonCallback();
if (toJsonMethod != null) { if (jsonCallback != null) {
try { if (jsonCallback.toJson(obj, format, writer, null))
if (toJsonMethod.getParameterTypes().length == 0) {
writer.append(String.valueOf(toJsonMethod.invoke(obj)));
} else {
writer.append(String.valueOf(toJsonMethod.invoke(obj, format)));
}
return; return;
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
} }
List<JsonEntityField> fields = jen.getFields(); List<JsonEntityField> fields = jen.getFields();
appendBraceBegin(); appendBraceBegin();
Expand Down

0 comments on commit 10b5eb0

Please sign in to comment.