1. 程式人生 > >android jackson解析,物件轉json,json轉物件,map...

android jackson解析,物件轉json,json轉物件,map...

題外話:以前一直用的Gson,後來發現Jackson的確要比Gson快,現在估計很長一段時間都要用jackson了。

前言以及準備工作:

當我在網上找Jackson的依賴包的時候,看到很多文章都是複製過來複制過去的,裡面給的依賴包只有核心包jackson-core-2.x.x,然而程式碼裡面卻需要用到jackson-databind-2.x.x裡面的東西,比如裡面有一個ObjectMapper類,只有後者的依賴包裡面才有,所以說,請那些抄部落格的人能夠copy得有水平一些嗎,最基本的依賴包都不講清楚。當然最好的方法還是學好英語,直接看官方的說明

 jar包在core資料夾裡面,三個版本都下載,並放到AndoidStudio的libs資料夾裡面依賴,我這裡用的是2.8.5版本:jackson-annotations-2.8.5,jackson-core-2.8.5,jackson-databind-2.8.5。

然後,當你依賴了這三個jar包之後,寫好程式碼執行的時候,十有八九會丟擲DuplicateFileException 這個異常,應該是屬於檔案衝突,有重複的檔案之類的,我也沒去仔細研究過,解決方法就是:在build.gradle檔案的android{}裡面新增以下程式碼

 packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }

jackson的使用

在這裡我只介紹幾種常用的方法,如果有更多需求請自行研究

1、java物件轉json

Student類:

public class Student {
        private String name;
        private String birthDay;
        private String gender;

        public Student(String name, String birthDay, String gender) {
            this.name = name;
            this.birthDay = birthDay;
            this.gender = gender;
        }

        public String getName() {
            return name;
        }

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

        public String getBirthDay() {
            return birthDay;
        }

        public void setBirthDay(String birthDay) {
            this.birthDay = birthDay;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }
    }


程式碼:
    private void objectToJson() {
        Student student = new Student("小智", "2006-12-12", "男");
        //ObjectMapper:操作json的核心類
        ObjectMapper mapper = new ObjectMapper();
        String studentJson = null;
        try {
            //將java物件轉換成json字串
            studentJson = mapper.writeValueAsString(student);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        Log.e("student", studentJson);
    }

列印結果:
student: {"birthDay":"2006-12-12","gender":"男","name":"小智"}

2、List/Map集合轉換json

程式碼:

private void listToJson() {
        List<Student> list = new ArrayList<>();
        list.add(new Student("小智", "2006-12-12", "男"));
        list.add(new Student("小剛", "2001-7-13", "男"));
        list.add(new Student("小霞", "2006-9-2", "女"));
        ObjectMapper mapper = new ObjectMapper();
        String studentList = null;
        try {
            studentList = mapper.writeValueAsString(list);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        Log.e("list", studentList);
    }

    private void mapToJson() {
        Map<String, String> map = new HashMap<>();
        map.put("game", "pokemon");
        map.put("indie_game", "FireWatch");
        map.put("Blizzard", "OverWatch");
        ObjectMapper mapper = new ObjectMapper();
        String gameMap = null;
        try {
            gameMap = mapper.writeValueAsString(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        Log.e("gameMap", gameMap);
    }

列印結果:
list: [{"birthDay":"2006-12-12","gender":"男","name":"小智"},{"birthDay":"2001-7-13","gender":"男","name":"小剛"},{"birthDay":"2006-9-2","gender":"女","name":"小霞"}]
gameMap: {"game":"pokemon","Blizzard":"OverWatch","indie_game":"FireWatch"}



3、json轉換java物件

程式碼:

   private void jsonToObject() {
        String student = "{\"birthDay\":\"2006-12-12\",\"gender\":\"男\",\"name\":\"小智\"}";
        ObjectMapper mapper = new ObjectMapper();
        Student student1 = null;
        try {
            student1 = mapper.readValue(student, Student.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.e("student1", student1.getBirthDay());
    }

列印結果:

student1: 2006-12-12

4、將json字串轉換成List集合

程式碼:

private void jsonToList() {
        String studentList = "[{\"birthDay\":\"2006-12-12\",\"gender\":\"男\",\"name\":\"小智\"},{\"birthDay\":\"2001-7-13\",\"gender\":\"男\",\"name\":\"小剛\"}, {\"birthDay\":\"2006-9-2\",\"gender\":\"女\",\"name\":\"小霞\"}]";
        ObjectMapper mapper = new ObjectMapper();
        List<Student> list = null;
        //先要先反序列化複雜型別
        //利用ObjectMapper的getTypeFactory().constructParametricType(Class<?> parametrized, Class<?>... parameterClasses)方法
        //獲取泛型容器(比如List/Map)的type
        JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Student.class);
        try {
            //再將這個type作為轉換的目標type
            list = mapper.readValue(studentList,javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.e("list", list.get(1).getBirthDay());
    }
附上constructParametricType(Class<?> parametrized, Class<?>... parameterClasses)方法的原始碼
其中parametrized是指你轉換的Collection型別,比如List,然後parameterClasses是指引數型別的陣列,比如這裡的Student
列印結果:
list: 2001-7-13
5、將json字串轉換成Map集合
程式碼:
 private void jsonToMap() {
        String mapString = "{\"birthDay\":\"2006-12-12\",\"gender\":\"男\",\"name\":\"小智\"}";
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> map = null;
        //和List一樣,Map依舊需要反序列化
        JavaType javaType = mapper.getTypeFactory().constructParametricType(HashMap.class, String.class, Object.class);
        try {
            //JSONObject jsonObject = new JSONObject(messageMap);
            map = mapper.readValue(mapString, javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (map != null) {
            Log.e("map", map.toString());
        }
    }
列印結果:
map: {name=小智, birthDay=2006-12-12, gender=男}
以上則是我認為比較常用的一些解析,更復雜的json解析也能用上面的幾種方法進行組合解析。