放牧代码和思想
专注自然语言处理、机器学习算法
    愛しさ 優しさ すべて投げ出してもいい

五分钟Jackson入门(一) JSON数据与Java对象相互转换(附项目源码)

JSONJavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,不仅便于机器解析,而且易于让人阅读。

谈起数据持久化储存,Java和MFC有序列化,Windows下还经常使用INI和注册表,甚至可以自己scanf printf一套新的标准。但是在网络上传递数据,尤其是需要时不时地检查调试数据的时候,则需要一种人眼可阅读的语言,这时就轮到JSON上场了。

serialize化的数据直接用文本工具打开看到的都是乱码,不同于serialize,JSON数据直接可以打开阅读,并且几乎不需要学习新的语法,非常便于阅读。比如:

{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}

一眼可以看出这段 JSON data 描述了一个用户的基本信息,其中name字段对应的是另一个对象(凡是大括号包起来的就是一个对象)。

那么在Java里如何解析和生成JSON数据呢?

Jackson 框架可以很轻松地完成这一任务:http://jackson.codehaus.org/

下面来看看如何将上述JSON数据转化为Java的对象。

首先去下载Jackson的库:

下载地址:http://wiki.fasterxml.com/JacksonDownload

Jackson 框架2.x似乎分成了三个jar包:

Core (release notes)

Annotations (release notes)

Databind (release notes)

第一个是核心jar,其余的是拓展。

而Jackson 框架1.x则集成为一整个jar包,非常便携,没有其他要求的话就用这个好了,1.x最新的版本下载地址:

http://jackson.codehaus.org/1.9.11/jackson-all-1.9.11.jar

然后建立测试项目,导入jar

项目结构:

其中User类是与上述JSON数据配套的Java类:

package com.hankcs;

import java.util.Arrays;

/**
 * @author Hankcs
 */
public class User
{
    public enum Gender
    {
        MALE, FEMALE
    };

    public static class Name
    {
        private String _first, _last;

        public String getFirst()
        {
            return _first;
        }

        public String getLast()
        {
            return _last;
        }

        public void setFirst(String s)
        {
            _first = s;
        }

        public void setLast(String s)
        {
            _last = s;
        }

        @Override
        public String toString()
        {
            return "Name{" +
                    "_first='" + _first + '\'' +
                    ", _last='" + _last + '\'' +
                    '}';
        }
    }

    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;

    public Name getName()
    {
        return _name;
    }

    public boolean isVerified()
    {
        return _isVerified;
    }

    public Gender getGender()
    {
        return _gender;
    }

    public byte[] getUserImage()
    {
        return _userImage;
    }

    public void setName(Name n)
    {
        _name = n;
    }

    public void setVerified(boolean b)
    {
        _isVerified = b;
    }

    public void setGender(Gender g)
    {
        _gender = g;
    }

    public void setUserImage(byte[] b)
    {
        _userImage = b;
    }

    @Override
    public String toString()
    {
        return "User{" +
                "_gender=" + _gender +
                ", _name=" + _name +
                ", _isVerified=" + _isVerified +
                ", _userImage=" + Arrays.toString(_userImage) +
                '}';
    }
}

/user.json就是等待解析JSON数据。

Main类:

package com.hankcs;

import org.codehaus.jackson.map.ObjectMapper;

import java.io.File;
import java.io.IOException;

public class Main
{

    public static void main(String[] args)
    {
        // write your code here
        ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
        try
        {
            // 尝试从JSON中读取对象
            User user = mapper.readValue(new File("user.json"), User.class);
            System.out.println(user);
            user.setGender(User.Gender.FEMALE);
            mapper.writeValue(new File("user-modified.json"), user);
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

只需要两句话就能解析出来:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

写入也很简单,一句话搞定:

mapper.writeValue(new File("user-modified.json"), user);

输出:

User{_gender=MALE, _name=Name{_first='Joe', _last='Sixpack'}, _isVerified=false, _userImage=[70, 111, 111, 98, 97, 114, 33]}

项目源码:http://pan.baidu.com/s/1dDiQ8Vn

参考资料:http://wiki.fasterxml.com/JacksonInFiveMinutes#Full_Data_Binding_.28POJO.29_Example

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » 五分钟Jackson入门(一) JSON数据与Java对象相互转换(附项目源码)

评论 4

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    怎么没用git呢,挺好用的呢

    Lipton红茶258010年前 (2013-12-31)回复
    • 下次试试,听说Windows下 tortoise git 挺好用:-)

      hankcs10年前 (2013-12-31)回复

我的作品

HanLP自然语言处理包《自然语言处理入门》