2010-12-03 9 views
5

¿Hay alguna forma de convertir mi salida de de nuevo a objeto java?Revertir ToStringBuilder: convertir cadena al objeto

Estoy buscando una manera fácil de representar un objeto de Java en un archivo de texto legible y poder convertir entre cadena y objeto.

Gracias,

+1

No se puede utilizar la interfaz de 'Serializable'? – dacwe

+1

por salida de ToStringBuilder, ¿a qué te refieres con que puedes publicar el código? –

+0

@dacwe - dijo "legible";) – Bozho

Respuesta

2

debe definir un formato estricto y seguir con un programa de análisis. Hay dos formatos aceptados:

Si usted no elige estos formatos que tendrá que manejar el análisis de sí mismo.

El ToStringBuilder no parece tener un equivalente inverso. Además, es incorrecto utilizar esta representación de cadena para dichos fines; está destinado solo a la depuración.

+0

No quiero introducir una nueva biblioteca en mi aplicación. XMLEncoder parece uno bueno, pero no sé si funcionará, porque mi aplicación está usando una versión muy antigua de axis. –

+0

la versión del eje no tiene nada que ver con ninguna de mis sugerencias. Agregar una biblioteca debería ser trivial. – Bozho

+0

¿por qué está mal? El buffer de protocolo de google tiene algo similar y no usa xml. –

0

XStream biblioteca es el perfecto

+0

Realmente no quiero usar XML bc mi aplicación todavía está usando una versión muy antigua del eje. Conflicto de la biblioteca aquí. –

1

Vas a tener que analizar su representación de cadena del objeto y luego construir un nuevo objeto inicializado con esos valores.

Si desea mantenerlo genérico y hacer que funcione para cualquier tipo de objeto, puede usar Apache BeanUtils para ayudar.

Por ejemplo, si su representación de cadena es:

[email protected][name=Stephen,age=29,smoker=false] 

omita el nombre de clase, campos y valores. A continuación, utilice BeanUtils para construir un nuevo Person:

String className = "Person"; 
Class beanClass = Class.forName(className); 
Person myPerson = (Person)beanClass.newInstance(); 
BeanUtils.setProperty(myPerson, "name", "Stephen"); 
BeanUtils.setProperty(myPerson, "age", "29"); 
BeanUtils.setProperty(myPerson, "smoker", "false"); 

Esto supone que la clase Person es un grano y expone getters/setters por sus campos.

+0

Realmente no quiero escribir un analizador sintáctico también se complica muy rápido cuando la propiedad de su grano es otro objeto. –

0

Aquí es un ejemplo del uso Gson:

public class GsonTest { 
    static class Name { String first; String last; } 
    static class Data { int number; Name name = new Name(); } 

    public static void main(String[] args) { 
     Gson gson = new Gson(); 

     Data data1 = new Data(); 
     data1.number = 1; 
     data1.name.first = "Joe"; 
     data1.name.last = "Smith"; 
     print("data1", data1); 

     String jsonString = gson.toJson(data1); 
     System.out.println("jsonString: " + jsonString); 

     Data data2 = gson.fromJson(jsonString, Data.class); 
     print("data2", data2); 
    } 

    private static void print(String id, Data data) { 
     System.out.println(id + "  :" 
       + " number=" + data.number 
       + " name.first=" + data.name.first 
       + " name.last=" + data.name.last); 
    } 
} 

salida

data1  : number=1 name.first=Joe name.last=Smith 
jsonString: {"number":1,"name":{"first":"Joe","last":"Smith"}} 
data2  : number=1 name.first=Joe name.last=Smith 

velocidad

Gson debe ser casi tan rápido como cualquier otro comparables basado en la reflexión Objeto < -> Marco de serialización de texto, pero no tengo datos de referencia.

Soporte haba de

diferencia de XStream (opcionalmente) y java.beans.XMLEncoder/XMLEncoder, Gson no utiliza setter y getter métodos de una clase. Más bien lee y escribe directamente los campos miembros de la clase, similar a la serialización binaria de Java (ObjectOutputStream, etc.) Mientras que Gson debería ser capaz de reunir y desmantelar la mayoría de los JavaBeans, este detalle de implementación de Gson debe tenerse en cuenta y justificarse.

Pretty-impresos JSON de salida

Por defecto GSON salidas JSON todo en una línea, como una optimización. Puede generar JSON que es un poco más fácil de leer. Para ello, la construcción del objeto Gson de una manera ligeramente diferente:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

La salida JSON (siguiendo con el ejemplo anterior), ahora se ve así:

{ 
    "number": 1, 
    "name": { 
    "first": "Joe", 
    "last": "Smith" 
    } 
} 

en lugar de

{"number":1,"name":{"first":"Joe","last":"Smith"}} 
+0

¿Sabes qué tan rápido es Gson y puedes publicar el resultado? –

+0

@Sean - Publiqué la salida. No tengo datos de referencia para Gson. Gson _debería ser tan rápido como otros marcos similares. –

+0

¿Quiere decir que Gson cambiará la visibilidad de mi campo privado? –

1

Sean, me encontré con tu pregunta mientras buscaba un convertidor de caso de prueba simple basado en una salida de cadena basada en reflexión de un objeto. Si bien una biblioteca más sólida para json o XML es ciertamente importante para una amplia gama de entradas, esto es útil para casos de prueba rápidos y sucios. Maneja POJOs simples, no anidados. Su única dependencia es apache commons.

estoy usando este formato toString:

@Override 
public String toString() { 
    return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); 
} 

Aquí está la clase:

public class FromStringBuilder { 

/** 
* Parses a string formatted with toStringBuilder 
* 
* @param input - ex. "Path[id=1039916,displayName=School Home,description=<null>,...]" 
* @return hashmap of name value pairs - ex. id=1039916,... 
*/ 
public static Map<String, String> stringToMap(String input) { 
    LinkedHashMap<String, String> ret = new LinkedHashMap<String, String>(); 
    String partsString = StringUtils.substringBetween(input, "[", "]"); 
    String[] parts = partsString.split(","); 
    for (String part:parts) { 
     String[] nv = part.split("="); 
     if (!StringUtils.equals("<null>", nv[1])) { 
      ret.put(nv[0], nv[1]); 
     } 
    } 
    return ret; 
} 

public static <T> T stringToObject(String input, Class<T> clazz) throws IllegalAccessException, InvocationTargetException, InstantiationException { 
    Map<String, String> map = stringToMap(input); 
    T ret = clazz.newInstance(); 
    BeanUtils.copyProperties(ret, map); 
    return ret; 
} 
}