2010-11-24 31 views
6

Hola, estoy usando Voldemort para almacenar mis datos. Mi clave es una palabra y los valores son el número de ocurrencia de la palabra y la URL. Por ejemplo:Cómo serializar el objeto JSON en java

key :question 
value: 10, www.stackoverflow.com 

Estoy utilizando el objeto Json para poner mis valores. Mi código es el siguiente

import org.json.JSONObject; 
import com.metaparadigm.jsonrpc.JSONSerializer; 
import voldemort.client.ClientConfig; 
import voldemort.client.SocketStoreClientFactory; 
import voldemort.client.StoreClient; 
import voldemort.client.StoreClientFactory; 

public class ClientExample { 
    public static void main (String [] args) { 
    String bootstrapUrl = "tcp://localhost:6666"; 

    ClientConfig cc = new ClientConfig(); 
    cc.setBootstrapUrls (bootstrapUrl); 
    String[] valuePair = new String[2]; 
    int val = 1; 
    StoreClientFactory factory = new SocketStoreClientFactory (cc); 
    StoreClient client = factory.getStoreClient("test"); 
    JSONObject json = new JSONObject(); 
    json.put("occurence",val); 
    json.put("url", "www.cnn.com"); 
    client.put("foo", json); 
    } 
} 

Y mi store.xml se parece a esto

<stores> 
    <store> 
    <name>test</name> 
    <persistence>bdb</persistence> 
    <routing>client</routing> 
    <replication-factor>1</replication-factor> 
    <required-reads>1</required-reads> 
    <required-writes>1</required-writes> 
    <key-serializer> 
     <type>string</type> 
    </key-serializer> 
    <value-serializer> 
     <type>java-serialization</type> 
    <schema-info>"Compount Types"</schema-info> 
    </value-serializer> 
    </store> 
</stores> 

Mientras yo estaba tratando de ejecutar el código que estoy recibiendo siguiente excepción: **

Excepción en el hilo "principal" voldemort.serialization.SerializationException: java.io.NotSerializableExc eption: org.json.JSONObject en voldemort.serialization.ObjectSerializer.toBytes (ObjectSerializer.java:47) en voldemort.store.serialized.SerializingStore.put (SerializingStore.java:109) en voldemort.store .DelegatingStore.put (DelegatingStore.java:68) en voldemort.client.DefaultStoreClient.put (DefaultStoreClient.java:208) en voldemort.client.DefaultStoreClient.put (DefaultStoreClient.java:193) en ClientExample. main (ClientExample.java:27) Causado por: java.io.NotSerializableException: org.json.JS ONObject en java.io.ObjectOutputStream.writeObject0 (Desconocido Fuente) en java.io.ObjectOutputStream.writeObject (Desconocido Fuente) en voldemort.serialization.ObjectSerializer.toBytes (ObjectSerializer.java:44)

**

Podría decirme cómo serializar el objeto JSON. Gracias de antemano.

Respuesta

3

Utilice el método .toString() de JSONObject para obtener el texto.

6

Eche un vistazo a la biblioteca Gson. Hace un buen JSON al mapeo y serialización de objetos.

0

En el caso de que todavía desee la serialización incorporada de Java sin tener que recurrir a ordenar su objeto JSON en notación de cadenas, una cosa que podría hacer es extender JSONObject y JSONArray desde org.json e implementar Serializable.

Luego puede usar sus propias versiones de JSONObject y JSONArray en general en lugar de los originales.

Asegúrese de definir todos los constructores en sus subclases y llamar a sus contrapartes de super(), así como implementar métodos específicos que devuelvan los tipos principales como getJSONObject() y getJSONArray() desde las propiedades.

5

Última respuesta, pero yo estaba buscando esto y he encontrado una solución. Solo para aclarar, mi problema era que mi clase contenía un org.json.JSONobject, y no se podía serializar, que es un paso necesario para pasar objetos en los objetos del paquete de Android.

  1. Añadir la palabra clave transient al campo.
  2. Proporcione las funciones writeObject y readObject para que el serializador llame. Esto parece una función de anulación, pero en realidad no está decorado con @Override.

De esta manera:

private void writeObject(ObjectOutputStream oos) throws IOException{ 
    oos.defaultWriteObject(); 
    oos.writeChars(_jsonObject.toString()); 
} 

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { 
    ois.defaultReadObject(); 
    loadJSON(ois.readUTF()); 
} 

3. En la función loadJSON, se llama al constructor JSONObject que toma una cadena, y asignarla al campo transitoria.

Me pareció mucho más fácil que reemplazar la biblioteca.

Cuestiones relacionadas