package org.nutz.json;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
import org.junit.Test;
import org.nutz.json.entity.JsonEntity;
import org.nutz.json.entity.JsonEntityField;
import org.nutz.json.impl.JsonEntityFieldMakerImpl;
import org.nutz.json.meta.JENObj;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
import org.nutz.lang.Strings;
import org.nutz.lang.inject.InjectBySetter;
public class JsonEntityTest {
@Test
public void test_entity_parse() {
JsonEntity jen = Json.getEntity(Mirror.me(JENObj.class));
assertEquals(3, jen.getFields().size());
assertEquals(long.class, jen.getField("id").getGenericType());
assertEquals(String.class, jen.getField("name").getGenericType());
assertEquals(int.class, jen.getField("age").getGenericType());
}
@Test
public void test_simple_JENObj() {
String str = "{id:9999999999, name:'abc', age:10}";
JENObj obj = Json.fromJson(JENObj.class, str);
assertEquals(9999999999L, obj.getObjId());
assertEquals("abc", obj.getName());
assertEquals(10, obj.getAge());
str = Json.toJson(obj);
obj = Json.fromJson(JENObj.class, str);
assertEquals(9999999999L, obj.getObjId());
assertEquals("abc", obj.getName());
assertEquals(10, obj.getAge());
}
@SuppressWarnings("unchecked")
@Test
public void test_JENObj_output() {
JENObj obj = new JENObj();
String str = Json.toJson(obj, JsonFormat.nice().setIgnoreNull(false));
Map<String, Object> map = (Map<String, Object>) Json.fromJson(str);
String[] keys = map.keySet().toArray(new String[map.size()]);
Arrays.sort(keys);
String keyStr = Lang.concat(",", keys).toString();
assertEquals("age,id,name", keyStr);
}
@Test
public void test_entity_field_maker() {
Json.clearEntityCache();
JENObj obj = new JENObj();
obj.setAge(100);
obj.setName("name");
obj.setObjId(9l);
Json.setDefaultFieldMaker(new AbstractJsonEntityFieldMaker() {
@Override
public JsonEntityField make(Mirror<?> mirror, Method method) {
return null;
}
@Override
public JsonEntityField make(Mirror<?> mirror, Field field) {
return null;
}
});
assertEquals("{}", Json.toJson(obj, JsonFormat.compact()));
Json.clearEntityCache();
Json.setDefaultFieldMaker(new AbstractJsonEntityFieldMaker() {
@Override
public JsonEntityField make(Mirror<?> mirror, Method method) {
if (method.getName().equals("setName")) {
String fn = Strings.lowerFirst(method.getName().substring(3));
return JsonEntityField.eval("another_name", method.getParameterTypes()[0], mirror.getEjecting(fn), new InjectBySetter(method));
}
return null;
}
@Override
public JsonEntityField make(Mirror<?> mirror, Field field) {
return JsonEntityField.eval("test_" + field.getName(), field.getType(), mirror.getEjecting(field), mirror.getInjecting(field.getName()));
}
});
String json = Json.toJson(obj, JsonFormat.compact());
assertTrue(json.contains("\"test_objId\":9"));
assertTrue(json.contains("\"test_name\":\"name\""));
assertTrue(json.contains("\"test_age\":100"));
assertTrue(json.contains("\"another_name\":\"name\""));
Json.clearEntityCache();
Json.setDefaultFieldMaker(new JsonEntityFieldMakerImpl());
}
}