使用 Jackson 将 Java 对象转换为 JSON

Posted

技术标签:

【中文标题】使用 Jackson 将 Java 对象转换为 JSON【英文标题】:Converting Java objects to JSON with Jackson 【发布时间】:2013-03-25 01:07:46 【问题描述】:

我希望我的 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);
    

我只是错过了如何 的部分:

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

我的问题是:我的课程是否正确?我必须调用哪个实例以及如何实现此 JSON 输出?

【问题讨论】:

以下教程可能会有所帮助:mkyong.com/java/how-to-convert-java-object-to-from-json-jackson 【参考方案1】:

要使用 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);

【讨论】:

唯一的问题是字符串从 ObjectWriter 中逃脱。使用:new JSONObject(ow.writeValueAsString(msg)) 如果它是通过 RESTful 等 Web 服务发送出去的。【参考方案2】:

我知道这是旧的(而且我是 java 新手),但我遇到了同样的问题。而且答案对我来说不像新手那么清楚......所以我想我会补充我所学到的。

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

对于基本 JSON 功能,您需要将以下 jar 添加到项目的库中: jackson-mapper-asl 和 jackson-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":"Sample","lastName":"User","email":"sampleU@example.com"

【讨论】:

你让我开心,谢谢【参考方案3】:

这可能有用:

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));

【讨论】:

【参考方案4】:

只需遵循以下任何一项:

对于 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();

【讨论】:

什么是 Response.ok ? 当我打开我的 Gson 对象的大小比使用 Jackson 时,插入 mongoDB 的 JSON 大小超过了允许的限制时遇到问题。只是一个提示。 问题是关于jackson,而不是Gson @Codeversed Response 是 Jersey 库中的一个类。 Response.ok 将返回带有状态码 200 的 JSON 响应。【参考方案5】:

你可以这样做:

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

【讨论】:

【参考方案6】:

你可以这样使用 Google Gson

UserEntity user = new UserEntity();
user.setUserName("UserName");
user.setUserAge(18);

Gson gson = new Gson();
String jsonStr = gson.toJson(user);

【讨论】:

【参考方案7】:

好吧,即使是接受的答案也没有完全输出 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());

【讨论】:

【参考方案8】:

注意:要使投票最多的解决方案发挥作用,POJO 中的属性必须是 public 或具有公共 getter/setter

默认情况下,Jackson 2 仅适用于 public,或者有一个公共的 getter 方法——序列化一个实体 将所有字段设为私有或包私有将失败。

尚未测试,但我相信此规则也适用于其他 JSON 库,例如 google Gson。

【讨论】:

【参考方案9】:
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();
    

【讨论】:

工作太多,反思太多!映射器应该让你从做这些样板的东西中解放出来! 我喜欢 Convectors!

以上是关于使用 Jackson 将 Java 对象转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用jackson将pojo(对象列表)转换为java中的json

Java - 使用jackson将json转换为复杂对象

使用jackson将json对象列表转换为hashmap

在Jackson中将Java对象转换为JsonNode [重复]

在将 json 反序列化为对象时,使用 jackson 将 asp.net / MS 专有 json Dateformat 转换为 java8 LocalDateTime

Jackson 对象和JSON的相互转换