2010-10-08 14 views
7

Soy nuevo en FlexJson y estaba siguiendo http://flexjson.sourceforge.net/ para un tutorial simple.
Escribí un programa simple pero parece que no está serializando los atributos del objeto. Por favor, ayúdame si alguien sabe de estoFlexJSON no serializa completamente objetos de clase

package com.webapp.enter; 

import flexjson.JSONSerializer; 

class PObject { 

     String name; 
     int age; 
     String country; 

     public PObject (String n, int a , String c){ 
      this.name = n; 
      this.country = c; 
      this.age = a; 
     } 

     public String toString(){ 
      return this.name + this.age + this.country; 
     } 

     public String[] getData(){ 
      return new String[]{ this.name, this.country}; 
     } 
} 

public class Person{ 

    public static void main(String main[]){ 
     PObject person = new PObject("harit",23,"india"); 
     System.out.println(person.name + " - " + person.age + " - " + person.country); 

     JSONSerializer serializer = new JSONSerializer(); 
     String out = serializer.serialize(person); 
     System.out.println("S : " + out); 

    } 
} 

Salida:

init: 
deps-module-jar: 
deps-ear-jar: 
deps-jar: 
compile-single: 
run-main: 
harit - 23 - india 
S : {"class":"com.webapp.enter.PObject"} 
BUILD SUCCESSFUL (total time: 0 seconds) 

(Actualización de la respuesta suprimido):

Me trataron de modificar el código usando métodos de captador/definidor, ahora falla diciendo lo siguiente. Me disculpo si lo estoy haciendo mal, yo soy nuevo en este

package com.webapp.enter; 

import flexjson.JSONSerializer; 

class PObject { 

     String name; 
     int age; 
     String country; 

     public PObject(){ 

     } 

     public void setName(String name){ 
      this.name = name; 
     } 

     public void setAge(int age){ 
      this.age = age; 
     } 

     public void setCountry(String country){ 
      this.country = country; 
     } 

     public String getName(){ 
      return this.name; 
     } 

     public int getAge(){ 
      return this.age; 
     } 

     public String getCountry(){ 
      return this.country; 
     } 

} 

public class Person{ 

    public static void main(String main[]){ 
     PObject person = new PObject(); 
     person.setAge(23); 
     person.setCountry("usa"); 
     person.setName("test"); 
     System.out.println(person.name + " - " + person.age + " - " + person.country); 

     JSONSerializer serializer = new JSONSerializer(); 
     String out = serializer.serialize(person); 
     System.out.println("S : " + out); 

    } 
} 

Salida:

test - 23 - usa 
Exception in thread "main" flexjson.JSONException: Error trying to deepSerialize 
     at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:97) 
     at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22) 
     at flexjson.JSONContext.transform(JSONContext.java:75) 
     at flexjson.JSONSerializer.serialize(JSONSerializer.java:378) 
     at flexjson.JSONSerializer.deepSerialize(JSONSerializer.java:301) 
     at com.webapp.enter.Person.main(Person.java:60) 
Caused by: java.lang.IllegalAccessException: Class flexjson.transformer.ObjectTransformer can not access a member of class com.webapp.enter.PObject with modifiers "public" 
     at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95) 
     at java.lang.reflect.Method.invoke(Method.java:607) 
     at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:45) 
     ... 5 more 
Java Result: 1 
BUILD SUCCESSFUL (total time: 0 seconds) 

Respuesta

8

Flexjson funciona con Java Beans y pObject no sigue la especificación Java Bean. O necesita agregar getters para sus propiedades: nombre, edad y país, o necesita marcar esos campos como públicos. Cualquiera de los dos funcionará. Agregue setters si planea usar JSONDeserializer para deserializar su objeto.

+0

Hola, chubbsondubs, tenía un problem.Does similares que afectan a si su getter y setters son privadas o de su constructor es privado? – faizan

+0

También puede dar un buen enlace para la especificación de Java Bean. Gracias de antemano. – faizan

+0

Puede marcar el getter/setter ya sea privado o protegido y Flexjson lo recogerá. Lo mismo vale para el constructor. – chubbsondubs

0

Si está utilizando Spring 3 o superior, entonces usted tiene que quitar la entrada como

map.remove ("org.springframework.validation.BindingResult.string");

del mapa del modelo justo antes de la serialización. Funciona a las mil maravillas. Es mejor que lo haga en el componente de vista donde está implementando la vista. Eche un vistazo al siguiente código.

public class JsonView implements View{ 

@Override 
public String getContentType() { 
    return "application/json"; 
} 

@Override 
public void render(Map<String, ?> map, HttpServletRequest hsr, HttpServletResponse response) throws Exception { 
    map.remove("org.springframework.validation.BindingResult.string"); 
    final String data = new JSONSerializer().deepSerialize(map); 

    response.getWriter().write(data); 
} 

}

Cuestiones relacionadas