如何在java中序列化JSON对象

时间:2010-11-24 00:18:59

标签: json

您好我正在使用Voldemort来存储我的数据。我的关键是一个单词,值是单词和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> 

当我尝试运行代码时,我遇到异常: **

  

线程“main”中的异常   的 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(未知   来源)at   java.io.ObjectOutputStream.writeObject(未知   来源)at   voldemort.serialization.ObjectSerializer.toBytes(ObjectSerializer.java:44)

**

您能否告诉我如何序列化JSON对象。提前谢谢。

4 个答案:

答案 0 :(得分:6)

查看Gson库。它对对象映射和序列化做了很好的JSON。

答案 1 :(得分:5)

迟到的答案,但我自己正在寻找这个,我找到了解决方案。为了澄清,我的问题是我的类包含一个org.json.JSONobject,它无法序列化,这是在Android Bundle对象中传递对象的必要步骤。

  1. 将关键字 transient 添加到字段中。
  2. 为序列化程序提供函数writeObject和readObject以进行调用。这看起来像一个覆盖函数,但实际上并没有用@Override修饰。
  3. 像这样:

    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构造函数,并将其分配给瞬态字段。

    我发现这比替换库要容易得多。

答案 2 :(得分:3)

使用JSONObject的.toString()方法获取文本。

答案 3 :(得分:0)

如果您仍然希望Java内置序列化而不必将JSON对象编组为字符串表示法,那么您可以做的一件事是从org.json扩展JSONObject和JSONArray并实现Serializable。

然后你可以全面使用你自己的JSONObject和JSONArray版本而不是原版。

确保在子类上定义所有构造函数并调用它们的super()对应项,并实现从属性返回父类型(如getJSONObject()和getJSONArray())的特定方法。