`
suipian1029
  • 浏览: 57774 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

JAVA实现json和对象间的相互转换

    博客分类:
  • java
阅读更多
一、新建一个项目,导入这两个jar包,下载见附件:
jackson-core-asl-1.9.12.jar
jackson-mapper-asl-1.9.12.jar

二、新建一个工具类

JsonMapper.java
Java代码 
package com.ebiz.logic.service.impl; 
 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.List; 
 
import org.apache.commons.lang3.StringUtils; 
import org.codehaus.jackson.JsonNode; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.DeserializationConfig; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.SerializationConfig; 
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; 
import org.codehaus.jackson.map.util.JSONPObject; 
import org.codehaus.jackson.type.JavaType; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
 
import com.ebiz.framework.util.date.DateUtil; 
 
/**
* 简单封装Jackson,实现JSON String<->Java Object的Mapper.

* 封装不同的输出风格, 使用不同的builder函数创建实例.

*/ 
public class JsonMapper { 
 
    private static Logger logger = LoggerFactory.getLogger(JsonMapper.class); 
 
    private ObjectMapper mapper; 
 
    public JsonMapper(Inclusion inclusion) { 
        mapper = new ObjectMapper(); 
        //设置输出时包含属性的风格 
        mapper.setSerializationInclusion(inclusion); 
        //设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
        //禁止使用int代表Enum的order()來反序列化Enum,非常危險 
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_NUMBERS_FOR_ENUMS, true); 
    } 
 
    /**
     * 创建输出全部属性到Json字符串的Mapper.
     */ 
    public static JsonMapper buildNormalMapper() { 
        return new JsonMapper(Inclusion.ALWAYS); 
    } 
 
    /**
     * 创建只输出非空属性到Json字符串的Mapper.
     */ 
    public static JsonMapper buildNonNullMapper() { 
        return new JsonMapper(Inclusion.NON_NULL); 
    } 
 
    /**
     * 创建只输出初始值被改变的属性到Json字符串的Mapper.
     */ 
    public static JsonMapper buildNonDefaultMapper() { 
        return new JsonMapper(Inclusion.NON_DEFAULT); 
    } 
 
    /**
     * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper.
     */ 
    public static JsonMapper buildNonEmptyMapper() { 
        return new JsonMapper(Inclusion.NON_EMPTY); 
    } 
 
    /**
     * 如果对象为Null, 返回"null".
     * 如果集合为空集合, 返回"[]".
     */ 
    public String toJson(Object object) { 
 
        try { 
            return mapper.writeValueAsString(object); 
        } catch (IOException e) { 
            throw NestedException.wrap(e); 
        } 
    } 
 
    /**
     * 如果JSON字符串为Null或"null"字符串, 返回Null.
     * 如果JSON字符串为"[]", 返回空集合.
     * 
     * 如需读取集合如List/Map, 且不是List<String>这种简单类型时,先使用函數constructParametricType构造类型.
     * @see #constructParametricType(Class, Class...)
     */ 
    public <T> T fromJson(String jsonString, Class<T> clazz) { 
        if (StringUtils.isEmpty(jsonString)) { 
            return null; 
        } 
 
        try { 
            return mapper.readValue(jsonString, clazz); 
        } catch (IOException e) { 
            throw NestedException.wrap(e); 
        } 
    } 
 
    /**
     * 如果JSON字符串为Null或"null"字符串, 返回Null.
     * 如果JSON字符串为"[]", 返回空集合.
     * 
     * 如需读取集合如List/Map, 且不是List<String>这种简单类型时,先使用函數constructParametricType构造类型.
     * @see #constructParametricType(Class, Class...)
     */ 
    @SuppressWarnings("unchecked") 
    public <T> T fromJson(String jsonString, JavaType javaType) { 
        if (StringUtils.isEmpty(jsonString)) { 
            return null; 
        } 
 
        try { 
            return (T) mapper.readValue(jsonString, javaType); 
        } catch (IOException e) { 
            throw NestedException.wrap(e); 
        } 
    } 
     
    @SuppressWarnings("unchecked") 
    public <T> T fromJson(String jsonString, Class<?> parametrized, Class<?>... parameterClasses) { 
        return (T) this.fromJson(jsonString, constructParametricType(parametrized, parameterClasses)); 
    } 
     
    @SuppressWarnings("unchecked") 
    public <T> List<T> fromJsonToList(String jsonString, Class<T> classMeta){ 
        return (List<T>) this.fromJson(jsonString,constructParametricType(List.class, classMeta)); 
    } 
     
    @SuppressWarnings("unchecked") 
    public <T> T fromJson(JsonNode node, Class<?> parametrized, Class<?>... parameterClasses) { 
        JavaType javaType = constructParametricType(parametrized, parameterClasses); 
        try { 
            return (T) mapper.readValue(node, javaType); 
        } catch (IOException e) { 
            throw NestedException.wrap(e); 
        } 
    } 
     
    @SuppressWarnings("unchecked") 
    public <T> T pathAtRoot(String json, String path, Class<?> parametrized, Class<?>... parameterClasses){ 
        JsonNode rootNode = parseNode(json); 
        JsonNode node = rootNode.path(path); 
        return (T) fromJson(node, parametrized, parameterClasses); 
    } 
     
    @SuppressWarnings("unchecked") 
    public <T> T pathAtRoot(String json, String path, Class<T> clazz){ 
        JsonNode rootNode = parseNode(json); 
        JsonNode node = rootNode.path(path); 
        return (T) fromJson(node, clazz); 
    } 
 
    /**
     * 構造泛型的Type如List<MyBean>, 则调用constructParametricType(ArrayList.class,MyBean.class)
     *             Map<String,MyBean>则调用(HashMap.class,String.class, MyBean.class)
     */ 
    public JavaType constructParametricType(Class<?> parametrized, Class<?>... parameterClasses) { 
        return mapper.getTypeFactory().constructParametricType(parametrized, parameterClasses); 
    } 
 
    /**
     * 當JSON裡只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.
     */ 
    @SuppressWarnings("unchecked") 
    public <T> T update(T object, String jsonString) { 
        try { 
            return (T) mapper.readerForUpdating(object).readValue(jsonString); 
        } catch (JsonProcessingException e) { 
            logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); 
        } catch (IOException e) { 
            logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); 
        } 
        return null; 
    } 
 
    /**
     * 輸出JSONP格式數據.
     */ 
    public String toJsonP(String functionName, Object object) { 
        return toJson(new JSONPObject(functionName, object)); 
    } 
 
    /**
     * 設定是否使用Enum的toString函數來讀寫Enum,
     * 為False時時使用Enum的name()函數來讀寫Enum, 默認為False.
     * 注意本函數一定要在Mapper創建後, 所有的讀寫動作之前調用.
     */ 
    public void setEnumUseToString(boolean value) { 
        mapper.configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, value); 
        mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, value); 
    } 
 
    /**
     * 取出Mapper做进一步的设置或使用其他序列化API.
     */ 
    public ObjectMapper getMapper() { 
        return mapper; 
    } 
     
    public JsonNode parseNode(String json){ 
        try { 
            return mapper.readValue(json, JsonNode.class); 
        } catch (IOException e) { 
            throw NestedException.wrap(e); 
        } 
    } 
     
    /**
     * 输出全部属性
     * @param object
     * @return
     */ 
    public static String toNormalJson(Object object){ 
        return new JsonMapper(Inclusion.ALWAYS).toJson(object); 
    } 
     
    /**
     * 输出非空属性
     * @param object
     * @return
     */ 
    public static String toNonNullJson(Object object){ 
        return new JsonMapper(Inclusion.NON_NULL).toJson(object); 
    } 
     
    /**
     * 输出初始值被改变部分的属性
     * @param object
     * @return
     */ 
    public static String toNonDefaultJson(Object object){ 
        return new JsonMapper(Inclusion.NON_DEFAULT).toJson(object); 
    } 
     
    /**
     * 输出非Null且非Empty(如List.isEmpty)的属性
     * @param object
     * @return
     */ 
    public static String toNonEmptyJson(Object object){ 
        return new JsonMapper(Inclusion.NON_EMPTY).toJson(object); 
    } 
     
    public void setDateFormat(String dateFormat){ 
        mapper.setDateFormat(new SimpleDateFormat(dateFormat)); 
    } 
     
    public static String toLogJson(Object object){ 
        JsonMapper jsonMapper = new JsonMapper(Inclusion.NON_EMPTY); 
        jsonMapper.setDateFormat(DateUtil.yyyy_MM_dd_HH_mm_ss); 
        return jsonMapper.toJson(object); 
    } 
 

三、再提供一个异常类

NestedException.java
Java代码 
package com.ebiz.logic.service.impl; 
 
public class NestedException extends RuntimeException { 
 
    private static final long serialVersionUID = 5893258079497055346L; 
     
    private Throwable throwable; 
 
    private NestedException(Throwable t) { 
        this.throwable = t; 
    } 
 
    /** Wraps another exeception in a RuntimeException. */ 
    public static RuntimeException wrap(Throwable t) { 
        if (t instanceof RuntimeException) 
            return (RuntimeException) t; 
        return new NestedException(t); 
    } 
 
    public Throwable getCause() { 
        return this.throwable; 
    } 
 
    public void printStackTrace() { 
        this.throwable.printStackTrace(); 
    } 
 

新建两个实体

Student.java
Java代码 
package com.ebiz.uniservice.fightdata.test; 
 
import java.util.List; 
 
public class Student { 
 
    private String name; 
    private int age; 
    private List<Teacher> teachers; 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setAge(int age) { 
        this.age = age; 
    } 
 
    public int getAge() { 
        return age; 
    } 
 
    public void setTeachers(List<Teacher> teachers) { 
        this.teachers = teachers; 
    } 
 
    public List<Teacher> getTeachers() { 
        return teachers; 
    } 
 


Teacher.java
Java代码 
package com.ebiz.uniservice.fightdata.test; 
 
public class Teacher { 
 
    private String name; 
    private int age; 
 
    public Teacher() { 
         
    } 
     
    public Teacher(String name, int age) { 
        super(); 
        this.name = name; 
        this.age = age; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setAge(int age) { 
        this.age = age; 
    } 
 
    public int getAge() { 
        return age; 
    } 


好了,来测试一把

JsonTest.java
Java代码 
package com.ebiz.uniservice.fightdata.test; 
 
import java.util.ArrayList; 
 
import com.ebiz.logic.service.impl.JsonMapper; 
 
/**

* @author jsqiu
*
*/ 
public class JsonTest { 
    public static void main(String[] args) { 
        Student student = getStudents(); 
        Long beginTime = System.currentTimeMillis(); 
        //bean2json 
        String json = JsonMapper.toLogJson(student); 
        System.out.println("对象转换为json:" + json); 
        System.out.println("转换用时:" + (System.currentTimeMillis()-beginTime) + "ms"); 
        //json2bean,需要注意:Student类和Teacher类必须有一个空的构造方法 
        beginTime = System.currentTimeMillis(); 
        //JsonMapper提供了很多创建Mapper的方法,不是非要用buildNonDefaultMapper,你可以对比几种方法的转换时间,挑个最快的 
        Student student2 = JsonMapper.buildNonDefaultMapper().fromJson(json, Student.class); 
        System.out.println("json转换成对象:" + student2); 
        System.out.println("转换用时:" + (System.currentTimeMillis()-beginTime) + "ms"); 
    } 
 
    /**
     * 初始化一个student
     * @return
     */ 
    private static Student getStudents() { 
        Teacher t1 = new Teacher("teacher1",35); 
        Teacher t2 = new Teacher("teacher1",25); 
        Teacher t3 = new Teacher("teacher1",30); 
        ArrayList<Teacher> teachers = new ArrayList<Teacher>(); 
        teachers.add(t1); 
        teachers.add(t2); 
        teachers.add(t3); 
        Student s = new Student(); 
        s.setAge(20); 
        s.setName("student1"); 
        s.setTeachers(teachers); 
        return s; 
    } 

输出如下:
对象转换为json:{"name":"student1","age":20,"teachers":[{"name":"teacher1","age":35},{"name":"teacher1","age":25},{"name":"teacher1","age":30}]}
转换用时:224ms
json转换成对象:com.ebiz.uniservice.fightdata.test.Student@55e55f
转换用时:25ms
分享到:
评论

相关推荐

    json格式与java类对象相互转换

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端交互,而Java作为后端开发的主要语言,常常需要将JSON格式的数据与Java类对象进行相互转换,以便于数据的处理和传输。Jackson库是...

    Json与java对象之间相互转换源码

    在Java中,我们经常需要将JSON字符串与Java对象进行相互转换,以便于数据的传输和处理。本篇文章将详细探讨这个过程,以及如何使用常见的Java JSON库,如Gson和Jackson,进行JSON与Java对象的转换。 首先,让我们...

    用于java对象与json对象间的相互转换(net.sf.json.JSONObject)

    是开源库Apache Commons的一个组件,提供了Java对象与JSON对象之间的转换功能。下面将详细阐述如何使用`JSONObject`进行JSON操作。 ### 1. 解析JSON字符串 当你从服务器获取或从文件读取到一个JSON字符串时,可以...

    java 和 json 对象间转换

    Java与JSON对象间转换的知识点涉及到Java中对象与JSON格式数据之间的互相转换方法,这是在Web开发和数据交互中常见的需求。在Java中处理JSON数据主要依靠一些第三方库,json-lib是其中之一,它能够将Java对象转换成...

    json转对象数组与对象数组转json --Java

    本文将详细介绍如何使用Java实现JSON字符串与对象数组之间的相互转换。 #### JSON转对象数组 首先来看一个具体的例子,假设我们有以下JSON字符串: ```java String obj = "[{\"MName\":\"aaa\",\"MValue\":\"bbb\...

    java实现Xml与json之间的相互转换操作示例

    java实现Xml与json相互转换的必要性:在Web开发中,我们经常需要在前后端之间进行数据的交换,由于后端和前端使用的数据格式可能不同,这时候就需要实现数据格式的转换,尤其是在使用Java作为后端开发语言时,如何将...

    form数据与json对象的互相转换(完整版)

    form数据与json对象的互相转换(完整版) * 将web Form 的数据转化成json字符串 * 将json对象的值解析后填入web Form 在AJAX开发中这是关键技术: 1、将form中的数据利用本工具转换成json格式的字符串,再通过ajax传...

    json与对象相互转换系列处理

    以下是对JSON与对象相互转换的一些详细说明: 1. **Python中的JSON操作**: - `json.dumps()`: 序列化对象到JSON字符串。例如,`json.dumps(obj, ensure_ascii=False)`可以将Python对象转化为JSON字符串,`ensure_...

    利用Google Gson实现JSON字符串和对象之间相互转换

    Gson库通过`Gson`类来实现JSON与Java对象的转换。当你有一个Java对象并想将其转化为JSON字符串时,可以使用`Gson().toJson()`方法;反之,如果你有一个JSON字符串并想解析成Java对象,可以使用`Gson().fromJson()`...

    使用fastjson实现对象和json串之间的相互转换的jar包

    在标题中提到的"使用fastjson实现对象和json串之间的相互转换的jar包",就是指通过引入Fastjson的jar依赖,开发者可以在项目中直接调用其API来实现这两个功能。 首先,让我们看看如何将Java对象转换为JSON字符串。...

    Java对Json的一系列操作(构建、json与对象的转换)

    总结,Java对JSON的操作主要包括构建JSON对象、将JSON字符串转换为Java对象、将Java对象转换为JSON字符串,以及与Map对象的相互转换。开发者可以根据项目需求选择Gson、Jackson或其他库进行JSON处理。理解并熟练掌握...

    java-对象数组转换为json

    下面将深入探讨如何在Java中实现对象数组向JSON的转换,并反过来将JSON字符串转换为Java对象数组,同时也会提及一些相关技术和代码示例。 ### Java对象数组转JSON 首先,我们来看如何将一个Java对象数组转换成JSON...

    安卓 JSON实现对象和数组的相互转换

    本篇文章将详细介绍如何在Android中利用Gson库实现JSON与对象、数组之间的相互转换。 Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,同时也能将JSON数据转换回等效的Java对象。在Android中,...

    Java对象与Json之间的互相转换的jar包

    这个"Java对象与Json之间的互相转换的jar包"正是提供了这样的功能。 这个jar包可能包含了如Jackson、Gson、Fastjson等流行的Java JSON库,它们各自提供了丰富的API来方便开发者进行对象与JSON的转换。 1. Jackson...

    java与json互相转换的jar包

    Java与JSON互相转换是开发过程中常见的需求,尤其是在服务器端与前端之间传递数据时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读性、易写性和高效性,被广泛应用于Web服务。Java则是...

    使用jackson完成json与java对象的互相转换实例

    Jackson是Java领域最流行的JSON处理库之一,它提供了高效且灵活的API来实现JSON与Java对象之间的相互转换。本实例将详细介绍如何使用Jackson库进行JSON到Java对象的反序列化以及Java对象到JSON的序列化。 首先,...

    JSON字符串和java对象的相互转换

    在Java开发中,JSON字符串与Java对象之间的相互转换是常见的操作,特别是在网络通信、数据存储以及API接口设计等领域。 JSON字符串转Java对象: 在Java中,我们通常使用第三方库如Jackson、Gson、Fastjson等来实现...

    Java图形实现json格式化

    Java图形实现JSON格式化主要涉及两个核心技术点:Java对JSON对象的操作和图形界面的设计。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人阅读和编写,同时也...

    java的xml和json相互转换工具类,亲测直接用

    本篇文章将详细介绍Java中如何实现XML和JSON的相互转换,并提供一个名为`XmlToJson.java`的工具类作为参考。 首先,XML是一种结构化的数据表示方式,它以树形结构存储数据,易于人类阅读和编写,同时也易于机器解析...

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

    在Java开发中,数据交换和存储经常涉及到对象与JSON字符串之间的转换。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Java提供了多种库来实现对象与...

Global site tag (gtag.js) - Google Analytics