Jeg arbejder iøjeblikket på en opgave , hvor jeg har behov for at bringe datamodellen ud til behandling i javascript på en nem facon . Ifbm med denne opgave har jeg tænkt på hvordan man kunne gøre det vha reflection.
Hvis vi antager flg klasser :
class A{
public int B;
public int C;
public D F;
public D G;
};
class D {
public String E;
}
og at de var initialiseret således:
A a=new A();
a.B=1;
a.C=2;
a.F=new D();
a.F.E="test";
a.G=new D();
a.G.E="test2";
Så kunne man kigge på selve java objekterne vha reflection for at generere JSON output til bruge i javascript således:
public class JsonEmit{
public static String emit(Object target) throws Exception{
StringBuilder sb=new StringBuilder();
sb.append("{");
Class targetClass=target.getClass();
Field[] publicFields = targetClass.getFields();
for (int i=0;i
Class typeClass = publicFields[i].getType();
String sFieldType = typeClass.getName();
Object value = publicFields[i].get(target);
if(value!=null){
sb.append(sFieldName+":");
if(typeClass.isPrimitive()
||sFieldType=="java.lang.String"){
sb.append("""+value.toString()+""");
}else{
sb.append(JsonEmit.emit(value));
}
}
if(i!=(publicFields.length-1))
sb.append(",");
}
sb.append("}");
return(sb.toString());
}
På den facon vil man kunne genere JSON ved et simpelt kald til
JsonEmit.emit(a)
hvorefter man vil se
{B:"1",C:"2",F:{E:"test"},G:{E:"test2"}}
Idéen er fin, men skal nok udvides lidt. For det første kræver JSON at property navne er i quotes, og for det andet bør alle primitive typer bevares, ikke konverteres til strenge.
Ja – jeg mangler vist anførselstegn omkring sFieldname i koden.Der kunne også evt filføjes checkes der gjorde at primitive type bliver bevaret – men efter at have kigget på http://www.ibm.com/developerworks/library/j-dyn0603/ , så vil jeg lige tænke lidt nærmere over om brugen af reflection til at generere json er hurtigt nok.