杰克逊库JSON映射器转字符串

10
我有一个类(AB是我的对象)。
public A   {
    private List<B> b;
    private int c;
}

我有一个字符串变量temp。我想将对象的JSON字符串保存在这个变量中。怎么做?

我已经尝试了以下两种方法,但没有结果。

public void save() {
    ObjectMapper mapper = new ObjectMapper();
    String temp = mapper.writeValueAsString(a);
}
public void read(String temp) {
    ObjectMapper mapper = new ObjectMapper();
    A a = mapper.readValue(temp, A.class);
}

我该如何解决这个问题?

“Without result”的意思是没有结果。我猜您需要在私有字段旁边添加@JsonProperty注释(Jackson遵循Bean约定,默认情况下仅序列化公共字段,而忽略私有字段)。 - StaxMan
1个回答

15

代码应该向 writeValueAsString 方法传递类型为 A 的实例,而不是实际的类。

ObjectMapper 可以通过反射确定实例的类型,但如果您没有传递实例,则无法确定要放置在生成的 JSON 中的字段值。

同时确保捕获或抛出适当的异常。

public void save() {

try {
        A a = new A();
        ObjectMapper mapper = new ObjectMapper();
        String temp = mapper.writeValueAsString(a);

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

}

你还应该为类 A 和类 B 上的字段提供访问器。 注意:我在前一句中包含了 B,因为 Jackson 必须能够映射我们提供给它的实例上的所有字段。

public A   {
    private List<B> b;
    private int c;

    private B getB(){ return b;}
    private void setB(B b){this.b = b;}
    private int getC(){return c;}
    private void setC(int c){this.c = c;}
}

这是一个我已经测试过的完整可工作的例子。

import java.io.IOException;
import java.util.List;

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

public class A {

    private List<B> b;
    private int c;

    public List<B> getB() {
        return b;
    }

    public void setB(List<B> b) {
        this.b = b;
    }

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }

    public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        A a = new A();
        ObjectMapper mapper = new ObjectMapper();
        String temp = mapper.writeValueAsString(a);
        System.out.println(temp);   
    }
}

class B{


}
如果这个简单的示例无法工作,则很可能没有在构建路径上找到jackson-mapper-asl.jar文件。请从此处下载文件,并将其放置在本地计算机的某个位置。
接下来,在Eclipse中,右键单击您的项目并选择属性。
然后选择“构建路径” > “库” > “添加外部Jars”。定位jar然后点击“确定”。

@user2520969 这个例子有帮助吗? - Kevin Bowersox
如果你复制了我的完整示例但无法运行,那么这是一个构建路径问题。这意味着你的类路径中没有适当的jar文件。你在使用Eclipse吗? - Kevin Bowersox
此外,请确保在 B 类中的每个字段都有相应的 get/set 方法。 - Kevin Bowersox
我在我的A类中做了一些更改,save方法可以正常运行。我用List<B> = new ArrayList<B>()替换了List<B> b = new List<B>()。现在我又遇到了另一个问题...我在两个活动中都有保存和读取函数,保存函数总是能正常运行,但读取函数第一次可以运行,第二次就不行了。为什么?同一个函数在两个活动中被调用... - user2520969

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