【问题标题】:Creating JSON objects directly from model classes in Java直接从 Java 中的模型类创建 JSON 对象
【发布时间】:2012-06-11 10:29:50
【问题描述】:

我的项目中有一些模型类,如CustomerProduct 等,它们有几个字段及其setter-getter 方法,我需要通过套接字将这些类的对象交换为JSONObject 往返于客户端和服务器。

有没有什么方法可以直接从模型类的对象创建JSONObject,这样对象的字段就成为该模型类对象的键,而该模型类对象的值成为此 JSONObject 的值。

例子:

Customer c = new Customer();
c.setName("Foo Bar");
c.setCity("Atlantis");
.....
/* More such setters and corresponding getters when I need the values */
.....

我创建 JSON 对象为:

JSONObject jsonc = new JSONObject(c); //I'll use this only once I'm done setting all values.

这让我得到了类似的东西:

{"name":"Foo Bar","city":"Atlantis"...}

请注意,在我的某些模型类中,某些属性本身是其他模型类的对象。如:

Product p = new Product();
p.setName("FooBar Cookies");
p.setProductType("Food");
c.setBoughtProduct(p);

在上述情况下,如我所料,生成的 JSON 对象将是:

{"name":"Foo Bar","city":"Atlantis","bought":{"productname":"FooBar Cookies","producttype":"food"}}

我知道我可以在每个模型类中创建类似 toJSONString() 的东西,然后创建和操作 JSON 友好的字符串,但是在我之前用 Java 创建 RESTful 服务的经验中(这完全脱离了上下文问题),我可以使用@Produces(MediaType.APPLICATION_JSON)从服务方法返回JSON字符串,并让方法返回模型类的对象。所以它生成了 JSON 字符串,我可以在客户端使用它。

我想知道在当前情况下是否有可能获得类似的行为。

【问题讨论】:

    标签: java json sockets


    【解决方案1】:

    Google GSON 这样做;我已经在几个项目中使用过它,它很简单而且效果很好。它可以在没有干预的情况下对简单对象进行翻译,但也有一种机制可以自定义翻译(双向)。

    Gson g = ...;
    String jsonString = g.toJson(new Customer());
    

    【讨论】:

    • 我依赖 json.org 库中的 JSONObject,所以我必须为此使用另一个库吗?
    • GSON 可以同时进行编码和解码,因此您可以删除 json.org 并改用 GSON。
    • 另外,我使用@XMLElement(name="somekeyname") 在我的 REST 服务事物中获取模型类的方法来控制键名,它在这里也可以吗?
    • 我不这么认为,不。 GSON 有自己的自定义编码机制。
    • 问题是关于获取 Json 对象而不是 Json 字符串。所以这段代码需要更多关于如何将 Gson 返回的字符串转换为正确的 JsonObject
    【解决方案2】:

    您可以为此使用 Gson

    Maven 依赖:

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.0</version>
    </dependency>
    

    Java 代码:

    Customer customer = new Customer();
    Product product = new Product();
    
    // Set your values ...
    
    Gson gson = new Gson();
    String json = gson.toJson(customer);
    
    Customer deserialized = gson.fromJson(json, Customer.class);
    

    【讨论】:

      【解决方案3】:
          User = new User();
          Gson gson = new Gson();
          String jsonString = gson.toJson(user);
          try {
              JSONObject request = new JSONObject(jsonString);
          } catch (JSONException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      

      【讨论】:

      • 请添加一些解释。您的回答目前被标记为“低质量”,最终可能会被删除。
      【解决方案4】:

      使用gson 来实现这一点。您可以使用以下代码获取json然后

      Gson gson = new Gson();
      String json = gson.toJson(yourObject);
      

      【讨论】:

      • OP 在询问 JSONObject
      【解决方案5】:

      我用XStream解析器来

          Product p = new Product();
          p.setName("FooBar Cookies");
          p.setProductType("Food");
          c.setBoughtProduct(p);
      
          XStream xstream = new XStream(new JettisonMappedXmlDriver());
          xstream.setMode(XStream.NO_REFERENCES);
          xstream.alias("p", Product.class);
          String jSONMsg=xstream.toXML(product);
          System.out.println(xstream.toXML(product));
      

      这将为您提供 JSON 字符串数组。

      【讨论】:

        猜你喜欢
        • 2015-09-20
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 2022-07-18
        相关资源
        最近更新 更多