如何在java中序列化JSON对象

如何在java中序列化JSON对象,java,json,serialization,Java,Json,Serialization,嗨,我在用伏地魔储存我的数据。我的关键字是一个单词,值是单词的出现次数和URL。例如: key :question value: 10, www.stackoverflow.com 我使用Json对象来放置我的值。 我的代码如下所示 import org.json.JSONObject; 导入com.metaparadigm.jsonrpc.JSONSerializer; 导入voldemort.client.ClientConfig; 导入voldemort.client.SocketSto

嗨,我在用伏地魔储存我的数据。我的关键字是一个单词,值是单词的出现次数和URL。例如:

key :question
value: 10, www.stackoverflow.com
我使用Json对象来放置我的值。 我的代码如下所示

import org.json.JSONObject;
导入com.metaparadigm.jsonrpc.JSONSerializer;
导入voldemort.client.ClientConfig;
导入voldemort.client.SocketStoreClientFactory;
导入voldemort.client.StoreClient;
导入voldemort.client.StoreClientFactory;
公共类客户端示例{
公共静态void main(字符串[]args){
字符串bootstrapUrl=”tcp://localhost:6666";
ClientConfig cc=newclientconfig();
cc.setBootstrapUrls(bootstrapUrl);
String[]valuePair=新字符串[2];
int-val=1;
StoreClientFactory=新SocketStoreClientFactory(cc);
StoreClient=factory.getStoreClient(“测试”);
JSONObject json=新的JSONObject();
json.put(“发生”,val);
json.put(“url”,“www.cnn.com”);
client.put(“foo”,json);
} 
} 
我的store.xml如下所示


试验
bdb
客户
1.
1.
1.
一串
java序列化
“复合类型”
当我试图运行代码时,出现以下异常: **

线程“main”中出现异常 voldemort.serialization.SerializationException: java.io.NotSerializableException: org.json.JSONObject位于 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) 在 main(ClientExample.java:27) 原因: java.io.NotSerializableException: org.json.JSONObject位于 java.io.ObjectOutputStream.WriteObject 0(未知 来源)在 java.io.ObjectOutputStream.writeObject(未知 来源)在 voldemort.serialization.ObjectSerializer.toBytes(ObjectSerializer.java:44)

**


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

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

看看库。它可以很好地实现JSON到对象的映射和序列化。

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

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


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

稍后回答,但我自己也在搜索,我已经找到了解决方案。只是想澄清一下,我的问题是我的类包含一个org.json.JSONobject,它无法序列化,这是在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());
    }
    
    三,。在loadJSON函数中,调用接受字符串的JSONObject构造函数,并将其分配给transient字段


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

    这很好,但是为什么要使用
    writeChars()
    而不是
    writeUTF()
    ?这是个错误吗?另外,如果JSONObject有可能根本没有初始化,那么您可能需要检查它是否为null。您可能是对的。但是我已经很久没有这样做了。