Как сериализовать объект JSON в Java
Привет я использую Волдеморт для хранения моих данных. Мой ключ - это слово, а значения - номер вхождения слова и URL. Например:
key :question
value: 10, www.stackru.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>
Пока я пытался запустить код, я получаю следующее исключение: **
Исключение в потоке "main"..java:109) в voldemort.store.DelegatingStore.put(DelegatingStore.java:68) в voldemort.client.DefaultStoreClient.put(DefaultStoreClient.java:208) в voldemort.client.DefaultStoreClient.put (DefaultStoreClient.jj:19 at ClientExample.main(ClientExample.java:27) Причина: java.io.NotSerializableException: org.json.JSONObject в java.io.ObjectOutputStream.writeObject0(неизвестный источник) в java.io.ObjectOutputStream.writeObject(неизвестный источник) voldemort.serialization.ObjectSerializer.toBytes (ObjectSerializer.java:44)
**
Не могли бы вы рассказать мне, как сериализовать объект JSON. Спасибо заранее.
4 ответа
Взгляните на библиотеку Gson. Это делает хороший JSON для отображения объектов и сериализации.
Поздний ответ, но я сам искал это и нашел решение. Просто чтобы уточнить, моя проблема заключалась в том, что мой класс содержал объект org.json.JSON, и его нельзя было сериализовать, что является необходимым шагом для передачи объектов в объекты Android Bundle.
- Добавьте ключевое слово transient в поле.
- Предоставьте функции 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, который принимает строку, и присваиваете ее переходному полю.
Я обнаружил, что это гораздо проще, чем заменить библиотеку.
Используйте метод.toString() JSONObject, чтобы получить текст.
В случае, если вы все еще хотите встроенную сериализацию Java, не прибегая к маршалу вашего JSON-объекта в строковую нотацию, вы могли бы просто расширить JSONObject и JSONArray из org.json и просто реализовать Serializable.
Затем вы можете использовать собственные версии JSONObject и JSONArray по всем направлениям вместо оригиналов.
Убедитесь, что вы определили все конструкторы в своих подклассах и вызвали их аналоги super(), а также реализовали специальные методы, которые возвращают родительские типы, такие как getJSONObject() и getJSONArray() из свойств.