Search in sources :

Example 6 with JsonEntityField

use of org.nutz.json.entity.JsonEntityField in project nutz by nutzam.

the class JsonRenderImpl method pojo2Json.

@SuppressWarnings("unchecked")
private void pojo2Json(Object obj) throws IOException {
    if (null == obj)
        return;
    /*
         * Default
         */
    Class<?> type = obj.getClass();
    JsonEntity jen = Json.getEntity(Mirror.me(type));
    Method toJsonMethod = jen.getToJsonMethod();
    if (toJsonMethod != null) {
        try {
            if (toJsonMethod.getParameterTypes().length == 0) {
                writer.append(String.valueOf(toJsonMethod.invoke(obj)));
            } else {
                writer.append(String.valueOf(toJsonMethod.invoke(obj, format)));
            }
            return;
        } catch (Exception e) {
            throw Lang.wrapThrow(e);
        }
    }
    List<JsonEntityField> fields = jen.getFields();
    appendBraceBegin();
    increaseFormatIndent();
    ArrayList<Pair> list = new ArrayList<Pair>(fields.size());
    for (JsonEntityField jef : fields) {
        if (jef.isIgnore())
            continue;
        String name = jef.getName();
        try {
            Object value = jef.getValue(obj);
            // 判断是否应该被忽略
            if (!this.isIgnore(name, value)) {
                Mirror mirror = null;
                // 以前曾经输出过 ...
                if (null != value) {
                    // zozoh: 循环引用的默认行为,应该为 null,以便和其他语言交换数据
                    mirror = Mirror.me(value);
                    if (mirror.isPojo()) {
                        if (memo.contains(value))
                            value = null;
                    }
                }
                // 如果是强制输出为字符串的
                if (null != value && jef.isForceString()) {
                    // 数组
                    if (value.getClass().isArray()) {
                        String[] ss = new String[Array.getLength(value)];
                        for (int i = 0; i < ss.length; i++) {
                            ss[i] = Array.get(value, i).toString();
                        }
                        value = ss;
                    } else // 集合
                    if (value instanceof Collection) {
                        Collection col = (Collection) Mirror.me(value).born();
                        for (Object ele : (Collection) value) {
                            col.add(ele.toString());
                        }
                        value = col;
                    } else // 其他统统变字符串
                    {
                        value = value2string(jef, value);
                    }
                } else if (jef.hasDataFormat() && null != value && value instanceof Date) {
                    value = jef.getDataFormat().format((Date) value);
                } else if (jef.hasDataFormat() && null != value && (mirror != null && mirror.isNumber())) {
                    value = jef.getDataFormat().format(value);
                }
                // 加入输出列表 ...
                list.add(new Pair(name, value));
            }
        } catch (FailToGetValueException e) {
        }
    }
    writeItem(list);
}
Also used : JsonEntity(org.nutz.json.entity.JsonEntity) ArrayList(java.util.ArrayList) Method(java.lang.reflect.Method) FailToGetValueException(org.nutz.lang.FailToGetValueException) IOException(java.io.IOException) FailToGetValueException(org.nutz.lang.FailToGetValueException) Date(java.util.Date) JsonEntityField(org.nutz.json.entity.JsonEntityField) Collection(java.util.Collection) Mirror(org.nutz.lang.Mirror)

Aggregations

JsonEntityField (org.nutz.json.entity.JsonEntityField)6 Method (java.lang.reflect.Method)4 ArrayList (java.util.ArrayList)3 JsonEntity (org.nutz.json.entity.JsonEntity)3 Field (java.lang.reflect.Field)2 FailToGetValueException (org.nutz.lang.FailToGetValueException)2 IOException (java.io.IOException)1 Collection (java.util.Collection)1 Date (java.util.Date)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 Test (org.junit.Test)1 El (org.nutz.el.El)1 JsonField (org.nutz.json.JsonField)1 JsonEntityFieldMakerImpl (org.nutz.json.impl.JsonEntityFieldMakerImpl)1 JENObj (org.nutz.json.meta.JENObj)1 Mirror (org.nutz.lang.Mirror)1 InjectBySetter (org.nutz.lang.inject.InjectBySetter)1 Callback (org.nutz.lang.util.Callback)1 Callback3 (org.nutz.lang.util.Callback3)1