Android-json解析(二):Jackson的使用
2017-05-10 11:27
302 查看
github链接:Jackson
推荐阅读 : Jackson 工具类使用及配置指南
使用Jackson,主要是使用writeValueAsString和readValue这两个方法。此外,Jackson的writeValue和readValue有很多种参数类型,适用于多中场合。
5.2 Gson运行报错
异常原因:
作为方法传入参数,Java编译过程会将泛型对象类型擦除。
解决方法:
1、直接copy方法内代码直接使用,而不通过方法传入
2、不使用
而使用以下:
异常com.google.gson.internal.StringMap cannot cast to..原因&解决方案
推荐阅读 : Jackson 工具类使用及配置指南
使用Jackson,主要是使用writeValueAsString和readValue这两个方法。此外,Jackson的writeValue和readValue有很多种参数类型,适用于多中场合。
1、导入依赖
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.0.pr3' compile 'com.fasterxml.jackson.core:jackson-core:2.9.0.pr3' compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.0.pr3'
2、添加packagingOptions
因为jackson-core和jackson-databind有重复的文件,重复加载会报错。android{ ... packagingOptions { exclude 'META-INF/NOTICE' // will not include NOTICE file exclude 'META-INF/LICENSE' // will not include LICENSE file } }
3、工具类:
package com.example.administrator.gsondemo; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Administrator on 2017/5/10. */ public class JacksonUtil { private final static ObjectMapper objectMapper = new ObjectMapper(); private JacksonUtil() { } public static ObjectMapper getInstance() { return objectMapper; } /** * javaBean,list,array convert to json string */ public static String obj2json(Object obj) throws Exception { return objectMapper.writeValueAsString(obj); } /** * json string convert to javaBean */ public static <T> T json2pojo(String jsonStr, Class<T> clazz) throws Exception { return objectMapper.readValue(jsonStr, clazz); } /** * json string convert to map */ public static <T> Map<String, Object> json2map(String jsonStr) throws Exception { return objectMapper.readValue(jsonStr, Map.class); } /** * json string convert to map with javaBean */ public static <T> Map<String, T> json2map(String jsonStr, Class<T> clazz) throws Exception { Map<String, Map<String, Object>> map = objectMapper.readValue(jsonStr, new TypeReference<Map<String, T>>() { }); Map<String, T> result = new HashMap<String, T>(); for (Map.Entry<String, Map<String, Object>> entry : map.entrySet()) { result.put(entry.getKey(), map2pojo(entry.getValue(), clazz)); } return result; } /** * json array string convert to list with javaBean */ public static <T> List<T> json2list(String jsonArrayStr, Class<T> clazz) throws Exception { List<Map<String, Object>> list = objectMapper.readValue(jsonArrayStr, new TypeReference<List<T>>() { }); List<T> result = new ArrayList<T>(); for (Map<String, Object> map : list) { result.add(map2pojo(map, clazz)); } return result; } /** * map convert to javaBean */ public static <T> T map2pojo(Map map, Class<T> clazz) { return objectMapper.convertValue(map, clazz); } }
4、测试
Person 类:
package com.example.administrator.gsondemo; /** * Created by Administrator on 2017/5/9. */ public class Person { private String name; private int age; private Birthday birthday; 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 Birthday getBirthday() { return birthday; } public void setBirthday(Birthday birthday) { this.birthday = birthday; } public Person() { } public Person(String name, int age, Birthday birthday) { this.name = name; this.age = age; this.birthday = birthday; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", birthday=" + birthday + '}'; } }
Birthday 类:
package com.example.administrator.gsondemo; /** * Created by Administrator on 2017/5/9. */ public class Birthday { private int year; private int month; private int day; public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public Birthday() { } public Birthday(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } @Override public String toString() { return "Birthday{" + "year=" + year + ", month=" + month + ", day=" + day + '}'; } }
MainActivity 类:
package com.example.administrator.gsondemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); objectsToJson_Jackson(); objectToJson_Jackson(); } /*------------------------------------Jackson----------------------------------*/ /** * 单一对象的json生成与解析 */ public void objectToJson_Jackson() { Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19)); String jsonString = null; try { jsonString = JacksonUtil.obj2json(p); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "---------jackson单一对象生成字符串--------"); Log.e(TAG, jsonString); Log.e(TAG, jsonString instanceof String ? "类型===String" : "类型不为String"); Person person = null; try { person = JacksonUtil.json2pojo(jsonString, Person.class); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "---------jackson单一字符串解析成对象--------"); Log.e(TAG, person.toString()); Log.e(TAG, "对象的名字::::" + person.getName()); } /** * 集合对象的json生成与解析 */ public void objectsToJson_Jackson() { Person person1 = new Person("zhaokaiqiang1", 21, new Birthday(1991, 1, 19)); Person person2 = new Person("zhaokaiqiang2", 22, new Birthday(1992, 2, 29)); Person person3 = new Person("zhaokaiqiang3", 23, new Birthday(1993, 3, 39)); ArrayList<Person> arrayList = new ArrayList<Person>(); arrayList.add(person1); arrayList.add(person2); arrayList.add(person3); String jsonString = null; try { jsonString = JacksonUtil.obj2json(arrayList); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "---------jackson集合对象生成字符串--------"); Log.e(TAG, jsonString); Log.e(TAG, jsonString instanceof String ? "类型===String" : "类型不为String"); List<Person> persons = null; try { persons = JacksonUtil.json2list(jsonString, Person.class); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "---------jackson集合字符串解析成对象--------"); Log.e(TAG, persons.toString()); Log.e(TAG, "对象的名字::::" + persons.get(0).getName()); } }
5、问题及解答:
5.1 运行后报以下错误,请参照上面第二条:添加packagingOptionsError:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/LICENSE File1: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-annotations\2.9.0.pr3\dede10be4aaaa6893561372dc5196644268997b7\jackson-annotations-2.9.0.pr3.jar File2: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-core\2.9.0.pr3\f9c6d5cfde33c589596d1f43200ec052a2c7c9c0\jackson-core-2.9.0.pr3.jar File3: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-databind\2.9.0.pr3\41a8d484e0fe00102724d03090503ad212ee3c20\jackson-databind-2.9.0.pr3.jar
5.2 Gson运行报错
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to...
异常原因:
作为方法传入参数,Java编译过程会将泛型对象类型擦除。
解决方法:
1、直接copy方法内代码直接使用,而不通过方法传入
2、不使用
public static <T> List<T> getObjectList(String jsonString,Class<T> cls){ List<T> list = new ArrayList<T>(); try { Gson gson = new Gson(); list = gson.fromJson(jsonString, new TypeToken<List<T>>(){}.getType()); } catch (Exception e) { e.printStackTrace(); } return list; }
而使用以下:
public static <T> List<T> getObjectList(String jsonString,Class<T> cls){ List<T> list = new ArrayList<T>(); try { Gson gson = new Gson(); JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray(); for (JsonElement jsonElement : arry) { list.add(gson.fromJson(jsonElement, cls)); } } catch (Exception e) { e.printStackTrace(); } return list; }
参考:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to异常com.google.gson.internal.StringMap cannot cast to..原因&解决方案
相关文章推荐
- Android中解析Json——Jackson使用
- Android中Json数据解析(二)--使用Gson、Jackson和FastJson解析Json数据
- Android中解析Json——Jackson使用
- Android Json 使用Jackson解析和生成json .
- android:json解析的两个工具:Gson和Jackson的使用小例子
- Android中Json数据解析(二)--使用Gson、Jackson和FastJson解析Json数据
- Android中解析Json——Jackson使用
- Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比
- Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比
- android:json解析的两个工具:Gson和Jackson的使用小例子
- Android Json的使用(2) 使用Jackson解析和生成json
- Android Json的使用(2) 使用Jackson解析和生成json
- android:json解析的两个工具:Gson和Jackson的使用小例子
- 【Android开发经验】比Gson解析速度快10倍!——Json解析神器Jackson使用介绍
- android:json解析的两个工具:Gson和Jackson的使用小例子
- android中json解析的两个工具:Gson和Jackson的使用小demo
- 在 Android 应用程序中使用 Internet 数据 解析 XML、JSON 和 protocol buffers 数据
- Android下使用Gson解析JSON数据
- Android的数据处理:使用annotation实现JSON字符串解析为java对象
- Android中使用Gson解析JSON数据