使用Jackson将Java对象转换为JSON

283

我希望我的JSON数据看起来像这样:

{
    "information": [{
        "timestamp": "xxxx",
        "feature": "xxxx",
        "ean": 1234,
        "data": "xxxx"
    }, {
        "timestamp": "yyy",
        "feature": "yyy",
        "ean": 12345,
        "data": "yyy"
    }]
}

目前代码:

import java.util.List;

public class ValueData {

    private List<ValueItems> information;

    public ValueData(){

    }

    public List<ValueItems> getInformation() {
        return information;
    }

    public void setInformation(List<ValueItems> information) {
        this.information = information;
    }

    @Override
    public String toString() {
        return String.format("{information:%s}", information);
    }

}

public class ValueItems {

    private String timestamp;
    private String feature;
    private int ean;
    private String data;


    public ValueItems(){

    }

    public ValueItems(String timestamp, String feature, int ean, String data){
        this.timestamp = timestamp;
        this.feature = feature;
        this.ean = ean;
        this.data = data;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getFeature() {
        return feature;
    }

    public void setFeature(String feature) {
        this.feature = feature;
    }

    public int getEan() {
        return ean;
    }

    public void setEan(int ean) {
        this.ean = ean;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return String.format("{timestamp:%s,feature:%s,ean:%s,data:%s}", timestamp, feature, ean, data);
    }
}

我只是不知道如何使用Jackson将Java对象转换为JSON:

public static void main(String[] args) {
   // CONVERT THE JAVA OBJECT TO JSON HERE
    System.out.println(json);
}

我的问题是:我的类是否正确?我应该调用哪个实例,以及如何获得这个JSON输出?


4
以下教程可能会有所帮助:http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/ - maple_shaft
11个回答

651

使用Jackson将您的object转换为JSON:

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.ObjectWriter; 

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);

23
唯一的问题是String从ObjectWriter中转义出来。如果将其通过Web服务(如RESTful)发送出去,请使用以下代码:new JSONObject(ow.writeValueAsString(msg))。 - jmarcosSF
1
JSONObject 的完全限定包名是什么?我在 jackson-databind 库中找不到它。 - Mehraj Malik
1
@MehrajMalik import org.json.JSONObject Maven 依赖: <dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20190722</version></dependency> - Skillz
如何设置编写器忽略空字段或空白字段?我在我的Spring Boot应用程序属性中设置了spring.jackson.default-property-inclusion = non_empty,但在这里并没有应用。 - undefined

50

我知道这是旧的(而我是Java的新手),但我遇到了同样的问题。答案对于我这个新手来说不够清晰...所以我想分享一下我的经验。

我使用了第三方库来帮助完成: org.codehaus.jackson 你可以在 这里 找到所有的下载。

为了使用JSON基本功能,你需要将以下JAR文件添加到项目库中: jackson-mapper-asljackson-core-asl

选择适合你的项目版本。(通常你可以选择最新的稳定版本)。

当它们被导入到项目库中后,将以下import行添加到你的代码中:

 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;

在定义了Java对象并赋值后,您希望将其转换为JSON并作为RESTful Web服务的一部分返回。

User u = new User();
u.firstName = "Sample";
u.lastName = "User";
u.email = "sampleU@example.com";

ObjectMapper mapper = new ObjectMapper();
    
try {
    // convert user object to json string and return it 
    return mapper.writeValueAsString(u);
}
catch (JsonGenerationException | JsonMappingException  e) {
    // catch various errors
    e.printStackTrace();
}

结果应该像这样:{"firstName":"示例","lastName":"用户","email":"sampleU@example.com"}


你让我的一天变得美好,谢谢。 - Roberto Clavijo
只是一个更新:在2.12版本或更高版本中,捕获JsonProcessingException而不是这两个异常。 - Digao

38

只需按照以下任意一种方式:

  • 对于jackson,应该可以正常工作:

      ObjectMapper mapper = new ObjectMapper();  
      return mapper.writeValueAsString(object);
      //will return json in string
  • 对于gson,它应该可以工作:

  •     Gson gson = new Gson();
        return Response.ok(gson.toJson(yourClass)).build();
    

    2
    Response.ok 是什么? - Codeversed
    1
    我在将JSON大小插入到mongoDB时遇到了问题,超过了允许的限制。当我打开我的Gson对象时,它比使用Jackson时具有更大的大小。只是一个提示。 - Daniela Morais
    22
    这个问题是关于“jackson”,而不是关于“Gson”。 - Ean V
    2
    @Codeversed Response是Jersey库中的一个类。Response.ok将返回状态码为200的JSON响应。 - Pranav

    20

    你可以这样做:

    String json = new ObjectMapper().writeValueAsString(yourObjectHere);
    

    16

    这可能会有用:

    objectMapper.writeValue(new File("c:\\employee.json"), employee);
    
    // display to console
    Object json = objectMapper.readValue(
         objectMapper.writeValueAsString(employee), Object.class);
    
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter()
         .writeValueAsString(json));
    

    11

    您可以像这样使用Google Gson

    UserEntity user = new UserEntity();
    user.setUserName("UserName");
    user.setUserAge(18);
    
    Gson gson = new Gson();
    String jsonStr = gson.toJson(user);
    

    3

    即使接受的答案并没有完全输出OP所要求的内容。它输出了JSON字符串,但是带有转义的双引号字符。因此,虽然可能有点晚,我还是希望我的回答能够帮助到人们!以下是我这样做的方法:

    StringWriter writer = new StringWriter();
    JsonGenerator jgen = new JsonFactory().createGenerator(writer);
    jgen.setCodec(new ObjectMapper());
    jgen.writeObject(object);
    jgen.close();
    System.out.println(writer.toString());
    

    3
    注意:为了使得票数最高的解决方案生效,POJO中的属性必须是 public 或者有一个公共的 getter/setter
    默认情况下,Jackson 2 只能处理公共的字段或者有公共的 getter 方法的字段。如果序列化一个所有字段都是私有或包私有的实体,那么将会失败。
    尚未测试,但我相信这个规则也适用于其他 JSON 库,如 Google Gson。

    0
    public class JSONConvector {
    
        public static String toJSON(Object object) throws JSONException, IllegalAccessException {
            String str = "";
            Class c = object.getClass();
            JSONObject jsonObject = new JSONObject();
            for (Field field : c.getDeclaredFields()) {
                field.setAccessible(true);
                String name = field.getName();
                String value = String.valueOf(field.get(object));
                jsonObject.put(name, value);
            }
            System.out.println(jsonObject.toString());
            return jsonObject.toString();
        }
    
    
        public static String toJSON(List list ) throws JSONException, IllegalAccessException {
            JSONArray jsonArray = new JSONArray();
            for (Object i : list) {
                String jstr = toJSON(i);
                JSONObject jsonObject = new JSONObject(jstr);
                jsonArray.put(jsonArray);
            }
            return jsonArray.toString();
        }
    }
    

    1
    太多工作,太多思考!映射器应该让你从这些模板式的事务中解脱出来! - Ean V
    3
    我喜欢导热器! - Christos
    2
    这是你按行计费时的代码样子。 - stinger

    0
    或者,您还可以使用cjson库将Java对象转换为JSON字符串 - maven
    CJson.toString()
    

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