从POJO创建JSONObject

30

我创建了一个简单的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呢?


你有没有查看过 JSON 序列化/反序列化器? - Vihar
3
尝试使用GSON库和gson.toJsonTree(yourObject).getAsJsonObject()。这将帮助您对对象进行序列化并将其转换为JSON格式的对象。 - EpicPandaForce
8个回答

48

只需使用Java的Gson API

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

接着您可以从这个json String创建一个JSONObject,如下:

JSONObject jsonObj = new JSONObject(json);

查看Gson用户指南简单的Gson示例以获取更多信息。


11
作者要求将POJO转换为JSONObject类型,而不是使用gson将其转换为(json)字符串类型。从严格意义上讲,这并没有回答问题。 - Samuel
@Samuel,获取它非常简单。您只需要将此字符串传递给新的JSONObject构造函数,如下所示:JSONObject jsonObj = new JSONObject(json); 或使用 JSONParser.parse() 方法。 - cнŝdk
别误会我的意思:我并不主张给你的回答投反对票。 - Samuel
@Samuel 不用担心,我只是在澄清一下。不管怎样,你的问题也很明显。 - cнŝdk

7

可以从POJO获取(gson) JsonObject:

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

之后,您可以获取object.entrySet()并查看整个树。

这是在GSON中动态设置要查看的字段的唯一绝对自由的方法。


这个解决方案对我在gson-2.2.4版本上有效。 - Vijay Vepakomma

5
Jackson 提供了 JSON 解析器/JSON 生成器作为基础构建块; 并添加了一个强大的数据绑定器 (JSON<->POJO) 和树模型作为可选附加块。这意味着你可以将 JSON 读取和写入,无论是作为令牌流 (流式 API),还是作为普通的 Java 对象 (POJOs, 数据绑定),或者作为树形结构 (树模型)。点击此处获取更多信息。
在你的项目中配置 Jackson,需要添加 jackson-core-asl-x.x.x.jar 和 jackson-mapper-asl-x.x.x.jar 库。
修改后的代码如下:
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"}

4
JSONObject input = new JSONObject(pojo);

最新版本支持这个功能。

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

2
您可以简单地使用以下解决方案:
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(loginPojo);
JSONObject jsonObject = new JSONObject(str);

2
您还可以使用 Project Lombok 与 Gson 覆盖 toString 函数。它会自动包含构建器、获取器和设置器,以便轻松进行数据分配,如下所示:
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);
    }
}

0

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

public LoginPojo(){
}

0
你可以使用
 <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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接