【问题标题】:How to serialize JSON object in java如何在java中序列化JSON对象
【发布时间】:2011-05-14 19:49:57
【问题描述】:

您好,我正在使用 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 在 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 在 java.io.ObjectOutputStream.writeObject0(未知 来源)在 java.io.ObjectOutputStream.writeObject(未知 来源)在 voldemort.serialization.ObjectSerializer.toBytes(ObjectSerializer.java:44)

**

能否请您告诉我如何序列化 JSON 对象。在此先感谢。

【问题讨论】:

    标签: java json serialization


    【解决方案1】:

    看看Gson 库。它在 JSON 到对象映射和序列化方面做得很好。

    【讨论】:

      【解决方案2】:

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

      1. 在字段中添加关键字transient
      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 构造函数,该构造函数接受一个字符串,并将其分配给瞬态字段。

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

      【讨论】:

      • 这很好,但你为什么使用writeChars()而不是writeUTF()?这是一个错误吗?此外,您可能需要检查 JSONObject 是否不为空,如果它有可能根本没有被初始化。
      • 你可能是对的。自从我这样做以来已经很久了。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-11-25
          • 1970-01-01
          • 1970-01-01
          • 2019-12-01
          • 2012-06-25
          • 1970-01-01
          • 2021-04-22
          • 1970-01-01
          • 2023-03-03
          相关资源
          最近更新 更多