【问题标题】:JSON binding with JAXB and Jackson in standalone JavaSE app独立 JavaSE 应用程序中与 JAXB 和 Jackson 的 JSON 绑定
【发布时间】:2013-12-03 13:58:00
【问题描述】:

我想在 JavaSE 独立应用程序中使用 JAXB 来读取和写入 Json 文件。 我设法用下面的 sn-p 为 XML 文件做到了这一点,但我不明白如何切换到 Json:

public class Main {

  public static void main(String[] args) throws Exception {
    Book book = new Book();
    book.title = "hello";

    JAXBContext context = JAXBContext.newInstance(Book.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(book, System.out);
  }

}

注意事项:

  • 性能不是问题。
  • Web 服务/REST 不在主题范围内。

【问题讨论】:

  • 有什么问题?下载 Jackson(及其 JAXB 扩展),阅读其文档并应用它。
  • 问题是我发现的大部分内容都是针对 webapps 的,其中我需要的配置部分在后台。
  • 没有魔法:只需创建ObjectMapper 并使用它的readValue()writeValue() 方法。还要注意,您不需要使用 JAXB —— JAXB 用于生成 XML(尽管也有执行某种形式的 JSON 输出的 impls)

标签: java json jaxb jackson


【解决方案1】:

使用 EclipseLink MOXy,您可以添加属性来操作输出。

    public class Main {

    public static void main(String[] args) {
        Book book = new Book();
        book.title = "hello";

        JAXBContext context;
        try {
            context = JAXBContextFactory.createContext(new Class[] {Book.class}, null);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(book, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

}

将导致: { “书” : { “标题”:“你好” } }

类路径上需要 org.eclipse.persistence.moxy-2.5.1.jar 和 org.eclipse.persistence.core-2.5.1.jar。 在我自己玩这个的时候,我遇到了:hottest JAXB answers。尤其是 Blaise Doughan 的回答非常有帮助。 搜索

MarshallerProperties.MEDIA_TYPE, "application/json" 

更多他的例子。

【讨论】:

【解决方案2】:

如果您愿意,您可以像这样非常简单地创建一个单独的方法(如果您已经拥有 JAXB 库)

主类

import java.io.IOException;
import javax.xml.bind.JAXBException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class ConvertJson {

    public static void main(String[] args) {
        final JavaObject javaObject = new JavaObject();
        javaObject.setName("Json");
        javaObject.setRole("Moderator");
        javaObject.setAge(28);

        try {
            pojo2Json(javaObject);
        } catch (JAXBException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private static String pojo2Json(Object obj) throws JAXBException,
            JsonParseException, JsonMappingException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = objectMapper.writeValueAsString(obj);
        System.out.print(jsonString);
        return jsonString;
    }

这里是波乔

import org.codehaus.jackson.annotate.JsonProperty;
public class JavaObject{
    @JsonProperty(value = "Name")
    private String name;
    @JsonProperty(value = "Role")
    private String role;
    @JsonProperty(value = "Age")
    private int age;
    public JavaObject(){
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

}

【讨论】:

    【解决方案3】:

    你会这样做:

    public class Main {
     public static void main(String[] args) throws IOException {
      Book book = new Book();
      book.title = "hello";
    
      ObjectMapper mapper = new ObjectMapper();
      mapper.writeValue(System.out, book);
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2017-05-07
      • 2015-09-19
      相关资源
      最近更新 更多