Как сериализовать объект JSON в Java - PullRequest
6 голосов
/ 24 ноября 2010

Привет! Я использую Волдеморта для хранения своих данных. Мой ключ - это слово, а значения - номер вхождения слова и URL. Например:

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

Я использую объект Json для установки своих значений. Мой код выглядит так

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); 
  } 
} 

А мой store.xml выглядит так

<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> 

Пока я пытался запустить код, я получаю следующее исключение: **

Исключение в теме "главная" voldemort.serialization.SerializationException: java.io.NotSerializableException: org.json.JSONObject at voldemort.serialization.ObjectSerializer.toBytes (ObjectSerializer.java:47) в voldemort.store.serialized.SerializingStore.put (SerializingStore.java:109) в voldemort.store.DelegatingStore.put (DelegatingStore.java:68) в voldemort.client.DefaultStoreClient.put (DefaultStoreClient.java:208) в voldemort.client.DefaultStoreClient.put (DefaultStoreClient.java:193) в ClientExample.main (ClientExample.java:27) Вызванный: java.io.NotSerializableException: org.json.JSONObject at java.io.ObjectOutputStream.writeObject0 (Неизвестно Источник) в java.io.ObjectOutputStream.writeObject (Неизвестно Источник) в voldemort.serialization.ObjectSerializer.toBytes (ObjectSerializer.java:44)

**

Подскажите, пожалуйста, как сериализовать объект JSON. Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 12 мая 2011

Посмотрите библиотеку Gson . Это делает хороший JSON для сопоставления объектов и сериализации.

5 голосов
/ 15 августа 2014

Поздний ответ, но я сам искал это и нашел решение.Просто чтобы уточнить, моя проблема заключалась в том, что мой класс содержал объект org.json.JSON, и его нельзя было сериализовать, что является необходимым шагом для передачи объектов в объекты Android Bundle.

  1. Добавьте объектключевое слово переходный к полю.
  2. Предоставить функции writeObject и readObject для вызова сериализатором.Это похоже на функцию переопределения, но на самом деле не имеет @ Override.

Как это:

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.В функции loadJSON вы вызываете конструктор JSONObject, который принимает строку, и присваиваете ее временному полю.

Я обнаружил, что это гораздо проще, чем заменить библиотеку.

3 голосов
/ 24 ноября 2010

Используйте метод .toString () JSONObject для получения текста.

0 голосов
/ 20 марта 2013

В случае, если вы все еще хотите встроенную сериализацию Java, не прибегая к маршалу вашего JSON-объекта в строковую нотацию, вы могли бы просто расширить JSONObject и JSONArray из org.json и просто реализовать Serializable.

Затем вы можете использовать собственные версии JSONObject и JSONArray по всей плате вместо оригиналов.

Убедитесь, что вы определили все конструкторы в своих подклассах и вызвали их аналоги super (), а также реализовали специфические реализацииметоды, которые возвращают родительские типы, такие как getJSONObject () и getJSONArray () из свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...