Last active
November 11, 2018 20:38
-
-
Save magirtopcu/cdc6bc26929927b966fd8cf422f9d04e to your computer and use it in GitHub Desktop.
Deadly simple JSON serializing of java pojos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package core; | |
import java.lang.reflect.Field; | |
import java.util.Collection; | |
import java.util.Date; | |
import java.util.HashMap; | |
import java.util.Map; | |
public class TinyJsonMapper { | |
public String convertJson(Object object){ | |
StringBuilder builder = new StringBuilder(); | |
try { | |
if(object instanceof Collection){ | |
convertCollection(builder,(Collection)object); | |
} | |
else{ | |
convertObject(builder,object); | |
} | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} | |
return builder.toString(); | |
} | |
interface Converter { | |
StringBuilder convert(StringBuilder sb, Object object); | |
} | |
public static Map<Class,Converter> converterMap = new HashMap<>(); | |
static { | |
converterMap.put(Number.class,(sb,ob)->{ | |
sb.append(ob); | |
return sb; | |
}); | |
converterMap.put(String.class,(sb,ob)->{ | |
String str = (String) ob; | |
str = str.replaceAll("\"","\\\\\""); | |
sb.append("\""). | |
append(str) | |
.append("\""); | |
return sb; | |
}); | |
converterMap.put(Date.class,(sb, ob)->{ | |
sb.append(((Date)ob).getTime()); | |
return sb; | |
}); | |
} | |
public boolean convertRegisteredTypes(StringBuilder sb, Object ob){ | |
if(ob == null){ | |
sb.append("null"); | |
return true; | |
} | |
Converter con = null; | |
if(ob instanceof Number){ | |
con = converterMap.get(Number.class); | |
} | |
else if(ob instanceof String ){ | |
con = converterMap.get(String.class); | |
} | |
else if(ob instanceof Date){ | |
con = converterMap.get(Date.class); | |
} | |
else{ | |
con = converterMap.get(ob.getClass()); | |
} | |
if(con!=null){ | |
con.convert(sb,ob); | |
return true; | |
} | |
return false; | |
} | |
public StringBuilder convertCollection(StringBuilder builder,Collection collection) throws IllegalAccessException { | |
builder.append("["); | |
for(Object colObj : (Collection)collection){ | |
convert(builder,colObj); | |
builder.append(","); | |
} | |
builder.deleteCharAt(builder.length()-1); | |
builder.append("]"); | |
return builder; | |
} | |
public StringBuilder convertObject(StringBuilder builder , Object object) throws IllegalAccessException { | |
builder.append("{"); | |
converToJson(builder,object); | |
builder.append("}"); | |
return builder; | |
} | |
public StringBuilder convert(StringBuilder builder,Object o) throws IllegalAccessException { | |
boolean registeredTypeConverted = convertRegisteredTypes(builder,o); | |
if(!registeredTypeConverted){ | |
if(o instanceof Collection){ | |
convertCollection(builder,(Collection) o); | |
} | |
else { | |
convertObject(builder,o); | |
} | |
} | |
return builder; | |
} | |
protected StringBuilder converToJson(StringBuilder builder,Object object) throws IllegalAccessException { | |
Field[] fields = object.getClass().getDeclaredFields(); | |
for(int i = 0;i<fields.length;i++){ | |
Field f = fields[i]; | |
builder.append("\""+f.getName()+"\"").append(":"); | |
f.setAccessible(true); | |
Object o = f.get(object); | |
convert(builder,o); | |
if(i!=fields.length-1){ | |
builder.append(","); | |
} | |
} | |
return builder; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment