/** * 配置 Model、Record 字段名的转换函数 * * <pre> * 例子: * JFinalJson.setModelAndRecordFieldNameConverter(fieldName -> { * return StrKit.toCamelCase(fieldName, true); * }); * * 以上例子中的方法 StrKit.toCamelCase(...) 的第二个参数可以控制大小写转化的细节 * 可以查看其方法上方注释中的说明了解详情 * </pre> */ public static void setModelAndRecordFieldNameConverter(Function<String, String>converter) { JFinalJsonKit.modelAndRecordFieldNameConverter = converter; }
此处有一个设置,可以在model或者record的时候指定序列化方式,但是在其它类型时无效,为什么不指定为全局的呢?一般的JSON格式都是下划线,这一点非常不方便。这些方法里面也未做任何处理,直接原样输出了。
static class BeanToJson implements ToJson<Object> { private static final Object[] NULL_ARGS = new Object[0]; private String[] fields; private Method[] methods; public BeanToJson(String[] fields, Method[] methods) { if (fields.length != methods.length) { throw new IllegalArgumentException("fields 与 methods 长度必须相同"); } this.fields = fields; this.methods = methods; } public void toJson(Object bean, int depth, JsonResult ret) { if (checkDepth(depth--, ret)) { return ; } try { ret.addChar('{'); boolean first = true; for (int i = 0; i < fields.length; i++) { Object value = methods[i].invoke(bean, NULL_ARGS); if (value == null && skipNullValueField) { continue ; } if (first) { first = false; } else { ret.addChar(','); } ret.addStrNoEscape(fields[i]); ret.addChar(':'); if (value != null) { ToJson tj = me.getToJson(value); tj.toJson(value, depth, ret); } else { ret.addNull(); } } ret.addChar('}'); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } }
如果在主配置已经设置为MixedJson,再去修改主配置为FastJson确实可以解决此问题,但是这也只是下下策,这样model和record又无法序列化了
@Test public void testRecordToJson() { JFinalJson.setModelAndRecordFieldNameConverter((s) -> { return Values.toWhichline(s, "_", true); }); Record ret = new Record(); ret.set("typeName", 1); ret.set("test_s", true); String json = JFinalJson.getJson().toJson(ret); System.out.println(json); } 结果: {"test_s":true,"type_name":1}
@Test public void testBeanToJson() { Cat cat = new Cat("kitty", 10, "macro"); // 无法将驼峰序列化成下划线或者其它指定方式 String json = JFinalJson.getJson().toJson(cat); System.out.println("jfinal json: " + json); String json2 = FastJson.getJson().toJson(cat); System.out.println("fast json: " + json2); } jfinal json: {"name":"kitty","nickName":"macro","age":10} fast json: {"age":10,"name":"kitty","nick_name":"macro"}
class ModelToJson extends ToJson
class RecordToJson extends ToJson
而 BeanToJson 也是一样的原理,要接管 BeanToJson 需要通过如下方法实现:
JFinalJsonKit.setToJsonFactory(Function> toJsonFactory);
建议看一下源码: 在 JFinalJsonKit.java 的 106 行