Jackson(一):java对象与json字符串互相转换

概要

Jackson是基于java平台的json处理框架。

Jackson提供了三种可选的json处理方法:流式API、树模型、数据绑定(data Binding),其中数据绑定是最常用的处理方式;本文主要介绍数据绑定的处理方式。

准备工作

  • JDK1.7开发环境
  • jackson 依赖的jar包:
    • jackson-core-2.5.3.jar
    • jackson-annotations-2.5.3.jar
    • jackson-databind-2.5.3.jar
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>

java对象与json字符串互相转换

java对象与json字符串互相转换的关键就是ObjectMapper对象的writeValue()方法 和 readValue()方法;
其中json字符串可以字符串的形式传入/传出,也可以以文件的形式传入/传出,见writeValue()方法 和 readValue()方法不同的参数。

ObjectMapper mapper = new ObjectMapper(); 
// java对象转换为json字符换
String Json =  mapper.writeValueAsString(student1); 
// json字符串转换为java对象
Student student2 = mapper.readValue(Json, Student.class);

代码示例

import java.io.IOException;
import org.json.JSONObject;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class jacksonTest {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();  
        try {

            /** json字符串转换为java对象 */

            // json中的对象个数比java对象的属性个数少
            JSONObject json1 = new JSONObject();
            json1.put("name", "anne");
            json1.put("age", 15);
            String d1 = json1.toString();
            Student s1 = mapper.readValue(d1, Student.class);
            System.out.println(s1.toString());

            // json中出现java对象中没有的属性
            JSONObject json2 = new JSONObject();
            json2.put("name", "anne");
            json2.put("age", 15);
            json2.put("sex", "boy");
            String d2 = json1.toString();
            Student s2 = mapper.readValue(d2, Student.class);
            System.out.println(s2.toString());

            /** java对象转换为json字符串 */
            Student s3 = new Student();
            s3.setAge(12);
            s3.setHobby("sport");
            s3.setName("anne");
            String d3 = mapper.writeValueAsString(s3);
            System.out.println(d3);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

}
@JsonIgnoreProperties(ignoreUnknown = true)
class Student {
    private String name;
    private int age;
    private String hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String toString() {
        return "name: " + name + ", age: " + age + ", hobby: " + hobby;
    }
}

输出:

name: anne, age: 15, hobby: null
name: anne, age: 15, hobby: null
{"name":"anne","age":12,"hobby":"sport"}

说明

  • json字符串中的key应该与java对象的属性名相同
  • java对象中属性如果为private,则需要显示生成getter/setter方法;如果属性为public,则可以不必写getter/setter方法
  • java对象如果有自定义的构造方法,json字符串转换为java对象时会出错
  • 如果json字符串中的属性个数小于java对象中的属性个数,可以顺利转换,java中多的那个属性为null
  • 如果json字符串中出现java对象中没有的属性,则在将json转换为java对象时会报错:Unrecognized field, not marked as ignorable
    解决方法:
    在目标对象的类级别上添加注解:@JsonIgnoreProperties(ignoreUnknown = true);如上述代码示例所示
  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用多种方式将XML字符串转换JSON字符串,或将JSON字符串转换成XML字符串。以下是一些常用的方法: 1. 使用第三方库 常用的XML和JSON转换库有:jackson、Gson、xmlpull、xmlbeans、dom4j、jdom等。这些库提供了各种将XML和JSON字符串互相转换的方法。例如,使用Jackson库将XML字符串转换JSON字符串: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; String xmlString = "<person><name>John</name><age>30</age></person>"; // 将XML字符串转换Java对象 XmlMapper xmlMapper = new XmlMapper(); Object obj = xmlMapper.readValue(xmlString, Object.class); // 将Java对象转换JSON字符串 ObjectMapper jsonMapper = new ObjectMapper(); String jsonString = jsonMapper.writeValueAsString(obj); System.out.println(jsonString); ``` 输出结果为: ```json {"person":{"name":"John","age":"30"}} ``` 2. 手动转换 也可以手动编写代码将XML和JSON字符串互相转换。例如,使用Java内置的XML DOM API将XML字符串转换JSON字符串: ```java import org.json.JSONObject; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.util.HashMap; import java.util.Map; String xmlString = "<person><name>John</name><age>30</age></person>"; // 将XML字符串解析为DOM对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlString))); // 将DOM对象转换JSON对象 JSONObject json = new JSONObject(); Element root = doc.getDocumentElement(); if (root.hasChildNodes()) { NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; Map<String, String> map = new HashMap<>(); if (element.hasAttributes()) { for (int j = 0; j < element.getAttributes().getLength(); j++) { map.put(element.getAttributes().item(j).getNodeName(), element.getAttributes().item(j).getNodeValue()); } } if (element.hasChildNodes()) { json.put(element.getNodeName(), element.getTextContent()); } else if (!map.isEmpty()) { json.put(element.getNodeName(), new JSONObject(map)); } } } } System.out.println(json.toString()); ``` 输出结果为: ```json {"person":{"name":"John","age":"30"}} ``` 3. 使用XPath表达式 我们还可以使用XPath表达式从XML中提取数据,并将其转换JSON格式。例如,使用Java内置的XPath API将XML字符串转换JSON字符串: ```java import org.json.JSONObject; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import java.io.StringReader; String xmlString = "<person><name>John</name><age>30</age></person>"; // 创建XPath对象 XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); // 编译XPath表达式 XPathExpression expr = xpath.compile("/*"); // 将XML字符串解析为DOM对象 InputSource source = new InputSource(new StringReader(xmlString)); NodeList nodes = (NodeList) expr.evaluate(source, XPathConstants.NODESET); // 将DOM对象转换JSON对象 JSONObject json = new JSONObject(); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; if (element.hasChildNodes()) { json.put(element.getNodeName(), element.getTextContent()); } } } System.out.println(json.toString()); ``` 输出结果为: ```json {"person":{"name":"John","age":"30"}} ``` 注意:以上示例仅供参考,实际使用时需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值