【问题标题】:Create JSONObject from POJO从 POJO 创建 JSONObject
【发布时间】:2015-01-18 03:39:39
【问题描述】:

我创建了一个简单的 POJO:

public class LoginPojo {
    private String login_request = null;
    private String email = null;
    private String password = null;

    // getters, setters
}

经过一番搜索,我发现了这个:JSONObject jsonObj = new JSONObject( loginPojo );

但是我得到了错误:

The constructor JSONObject(LoginPojo) is undefined

我找到了另一个解决方案:

JSONObject loginJson = new JSONObject();
loginJson.append(loginPojo);

但是这个方法不存在。

那么如何将我的 POJO 转换为 JSON?

【问题讨论】:

  • 你检查过 jsonSerializer/de-serializer 吗?
  • 尝试使用GSON库和gson.toJsonTree(yourObject).getAsJsonObject()

标签: java json


【解决方案1】:

只需使用java Gson API:

Gson gson = new GsonBuilder().create();
String json = gson.toJson(obj);// obj is your object 

然后你可以从这个jsonString创建一个JSONObject,像这样:

JSONObject jsonObj = new JSONObject(json);

查看Gson user guideSIMPLE GSON EXAMPLE 了解更多信息。

【讨论】:

  • 作者要求将 POJO 转换为 JSONObject 类型,而不是使用 gson 类型 (json) String。狭义上,这不是回答问题。
  • @Samuel 获得它是如此简单。您只需将此字符串传递给新的 JSONObject 构造函数,如下所示:JSONObject jsonObj = new JSONObject(json); 或使用 JSONParser .parse() 方法。
  • 别误会我的意思:我并不是在提倡对你的答案投反对票。
  • @Samuel 不,没关系,我只是澄清一下,无论如何你的问题也很明显。
【解决方案2】:

Jackson 提供 JSON 解析器/JSON 生成器作为基础构建块;并添加了强大的 Databinder (JSONPOJO) 和树模型作为可选的附加块。这意味着您可以将 JSON 作为令牌流(流式 API)、普通旧 Java 对象(PO​​JO、数据绑定)或树(树模型)读取和写入。 for more reference

您必须添加jackson-core-asl-x.x.x.jarjackson-mapper-asl-x.x.x.jar 库才能在您的项目中配置Jackson

修改代码:

LoginPojo loginPojo = new LoginPojo();
ObjectMapper mapper = new ObjectMapper();

try {
    mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

    // Setting values to POJO
    loginPojo.setEmail("a@a.com");
    loginPojo.setLogin_request("abc");
    loginPojo.setPassword("abc");

    // Convert user object to json string
    String jsonString = mapper.writeValueAsString(loginPojo);

    // Display to console
    System.out.println(jsonString);

} catch (JsonGenerationException e){
    e.printStackTrace();
} catch (JsonMappingException e){
    e.printStackTrace();
} catch (IOException e){
    e.printStackTrace();
}

Output : 
{"login_request":"abc","email":"a@a.com","password":"abc"}

【讨论】:

    【解决方案3】:

    可以从 POJO 中获取一个(gson)JsonObject:

    JsonElement element = gson.toJsonTree(userNested);
    JsonObject object = element.getAsJsonObject();
    

    之后你可以拿object.entrySet()查看所有的树。

    这是 GSON 中唯一完全免费的方式来动态设置您想查看的字段。

    【讨论】:

    • 这个解决方案在gson-2.2.4 版本上为我工作。
    【解决方案4】:
    JSONObject input = new JSONObject(pojo);
    

    这适用于最新版本。

    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180130</version>
    </dependency>
    

    【讨论】:

      【解决方案5】:

      您还可以使用 project lombok 和 Gson 覆盖 toString 函数。它会自动包含构建器、getter 和 setter,以简化数据分配,如下所示:

      User user = User.builder().username("test").password("test").build();
      

      在示例类下面找到:

      import lombok.AllArgsConstructor;
      import lombok.Builder;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      import com.google.gson.Gson;
      
      @Data
      @Builder(toBuilder = true)
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
          /* User name. */
          private String username;
          /* Password. */
          private String password;
      
          @Override
          public String toString() {
              return new Gson().toJson(this, User.class);
          }
      
          public static User fromJSON(String json) {
              return new Gson().fromJson(json, User.class);
          }
      }
      

      【讨论】:

        【解决方案6】:

        您只需使用以下解决方案:

        ObjectMapper mapper = new ObjectMapper();
        String str = mapper.writeValueAsString(loginPojo);
        JSONObject jsonObject = new JSONObject(str);
        

        【讨论】:

          【解决方案7】:

          我在我的项目中使用杰克逊,但我认为你需要一个空的构造函数。

          public LoginPojo(){
          }
          

          【讨论】:

            【解决方案8】:

            你可以使用

             <dependency>
               <groupId>com.alibaba</groupId>
               <artifactId>fastjson</artifactId>
               <version>1.2.13</version>
             </dependency>
            

            创建 JSON 对象:

            @Test
            public void whenGenerateJson_thanGenerationCorrect() throws ParseException {
                JSONArray jsonArray = new JSONArray();
                for (int i = 0; i < 2; i++) {
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("AGE", 10);
                    jsonObject.put("FULL NAME", "Doe " + i);
                    jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
                    jsonArray.add(jsonObject);
                }
                String jsonOutput = jsonArray.toJSONString();
            }
            

            像这样将注释添加到您的 POJO 类中:

            @JSONField(name = "DATE OF BIRTH")
            private String dateOfBirth;
            etc...
            

            那么你可以简单地使用:

            @Test
            public void whenJson_thanConvertToObjectCorrect() {
                Person person = new Person(20, "John", "Doe", new Date());
                String jsonObject = JSON.toJSONString(person);
                Person newPerson = JSON.parseObject(jsonObject, Person.class);
            
                assertEquals(newPerson.getAge(), 0); // if we set serialize to false
                assertEquals(newPerson.getFullName(), listOfPersons.get(0).getFullName());
            }
            

            您可以在以下网站上找到更完整的教程: https://www.baeldung.com/fastjson

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-07-11
              • 1970-01-01
              • 1970-01-01
              • 2020-03-25
              • 2021-01-22
              • 1970-01-01
              • 2014-07-12
              相关资源
              最近更新 更多