【问题标题】:Java program terminating after ObjectMapper.writeValue(System.out, responseData) - Jackson LibraryJava 程序在 ObjectMapper.writeValue(System.out, responseData) 之后终止 - Jackson Library
【发布时间】:2012-01-12 10:33:28
【问题描述】:

我正在使用 Jackson 库创建 JSON 对象,但是当我使用 mapper.writeValue(System.out, responseData) 函数时,程序终止。这是我的代码:

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class Test {

    public static void main(String[] args){
        new Test().test();
    }

    public void test() {
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> responseData = new HashMap<String, Object>();

        responseData.put("id", 1);

        try {
            mapper.writeValue(System.out, responseData);
            System.out.println("done");
        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }.

}

执行后,控制台显示 {"id":1},但不显示 "done"。

【问题讨论】:

    标签: java json jackson terminate


    【解决方案1】:

    问题在于 Jackson 实现,因为 ObjectMapper._configAndWriteValue 调用 UtfGenerator.close(),而后者又调用 PrintStream.close()。

    我会在https://jira.codehaus.org/browse/JACKSON 记录一个问题

    要更改目标被关闭的默认行为,您可以执行以下操作:

    mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
    

    【讨论】:

    • 这不是一个错误,而是一个特性——默认情况下,在使用高级 ObjectMapper.writeValue() 方法时,OutputStream 确实是关闭的。但是很好地解释了实际问题。如果不需要行为,您可以在 ObjectMapper 上禁用该功能 (JsonGenerator.Feature.AUTO_CLOSE_TARGET):mapper.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)
    • 好的。是的,然后应该有mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false),但如果它们丢失了,也应该添加便利方法。
    • 是的,mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); 成功了。
    • 我会记录一个问题并要求对其进行更改。调用者创建了流,因此应该拥有它的生命周期。糟糕的 API。
    • @ProgrammerBruce 我可以问哪个 jar 包含包JsonGenerator
    【解决方案2】:

    在数据文件/getter 文件中声明变量名称时,第一个字母应该很小。

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。
    • @JRichardSnape - 我不同意。虽然第一句和签名需要删除,但总体信息是问题源于变量区分大小写。答案可能是错误的,但它仍会尝试回答问题。
    • @SomethingDark 很公平 - 我看到了你的编辑。我想这里有一个回答的尝试——也许我在审核队列中有点反应迟钝。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多