Json字符串处理

来源:互联网 发布:四川大学网络本科 编辑:程序博客网 时间:2024/05/17 03:01

工作中碰到一个Json对象转List不成功的问题,记录下


<span style="white-space:pre"></span>public static void main(String[] args) {String keywordUpdate = "{\"keywordTypes\":[{\"adgroupId\":10394588,\"keyword\":\"测试1\"},{\"adgroupId\":10394588,\"keyword\":\"测试2\"}]}";JSONObject jasonObject = JSONObject.fromObject(keywordUpdate);Object keywordTypes = jasonObject.get("keywordTypes");List<KeywordType>  dtoList=new ArrayList<KeywordType>();JSONArray jsonArray = JSONArray.fromObject(String.valueOf(keywordTypes));Object[] objectArr=jsonArray.toArray();for(Object obj:objectArr){Map<String,Object> objMap= (Map<String,Object>)JSON.parse(String.valueOf(obj));KeywordType keywordBean=  MapConvertUtil.toBean(KeywordType.class, objMap);dtoList.add(keywordBean);}System.out.println(dtoList);}

MapConvertUtil
package com.perfect.baidu.assistant.util.convert;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.perfect.baidu.assistant.util.DateUtil;/** * map转换 */public class MapConvertUtil {    private static Logger logger = LoggerFactory.getLogger(MapConvertUtil.class);    /**     * 转换时对map中的key里的字符串会做忽略处理的正则串     */    private static final String OMIT_REG = "_";    /**     * 将map集合转换成Bean集合,Bean的属性名与map的key值对应时不区分大小写,并对map中key做忽略OMIT_REG正则处理     *      * @param <E>     * @param cla     * @param mapList     * @return     */    public static <E> List<E> toBeanList(Class<E> cla, List<Map<String, Object>> mapList) {        List<E> list = new ArrayList<E>(mapList.size());        for (Map<String, Object> map : mapList) {            E obj = toBean(cla, map);            list.add(obj);        }        return list;    }        /**     * 将map集合转换成Bean集合,Bean的属性名与map的key值对应时不区分大小写,并对map中key做忽略OMIT_REG正则处理     *      * @param <E>     * @param cla     * @param mapList     * @return     */<span style="white-space:pre"></span>public static <E> List<E> toBeanList(Class<E> cla, List<Map<String, Object>> mapList, Map<String, Object> mapping) {<span style="white-space:pre"></span>List<E> list = new ArrayList<E>(mapList.size());<span style="white-space:pre"></span>for (Map<String, Object> map : mapList) {<span style="white-space:pre"></span>if (null != mapping && !mapping.isEmpty()) {<span style="white-space:pre"></span>E obj = toBean(cla, map, mapping);<span style="white-space:pre"></span>list.add(obj);<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>E obj = toBean(cla, map);<span style="white-space:pre"></span>list.add(obj);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return list;<span style="white-space:pre"></span>}    /**     * 将map转换成Bean,Bean的属性名与map的key值对应时不区分大小写,并对map中key做忽略OMIT_REG正则处理     *      * @param <E>     * @param cla     * @param map     * @return     */    @SuppressWarnings({"rawtypes"})<span style="white-space:pre"></span>public static <E> E toBean(Class<E> cla, Map<String, Object> map) {<span style="white-space:pre"></span>// 创建对象<span style="white-space:pre"></span>E obj = null;<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>obj = cla.newInstance();<span style="white-space:pre"></span>if (obj == null) {<span style="white-space:pre"></span>throw new Exception();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} catch (Exception e) {<span style="white-space:pre"></span>logger.error("类型实例化对象失败,类型:" + cla);<span style="white-space:pre"></span>return null;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>// 处理map的key<span style="white-space:pre"></span>Map<String, Object> newmap = new HashMap<String, Object>();<span style="white-space:pre"></span>for (Map.Entry<String, Object> en : map.entrySet()) {<span style="white-space:pre"></span>newmap.put("set" + en.getKey().trim().replaceAll(OMIT_REG, "").toLowerCase(), en.getValue());<span style="white-space:pre"></span>}<span style="white-space:pre"></span>// 进行值装入<span style="white-space:pre"></span>Method[] ms = cla.getMethods();<span style="white-space:pre"></span>for (Method method : ms) {<span style="white-space:pre"></span>String mname = method.getName().toLowerCase();<span style="white-space:pre"></span>if (mname.startsWith("set")) {<span style="white-space:pre"></span>Class[] clas = method.getParameterTypes();<span style="white-space:pre"></span>Object v = newmap.get(mname);<span style="white-space:pre"></span>if (v != null && clas.length == 1) {<span style="white-space:pre"></span>String type = clas[0].toString();<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>if (type.equals("class java.lang.Integer")) {<span style="white-space:pre"></span>int value = ((Integer) v).intValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.String")) {<span style="white-space:pre"></span>String value = (String) v;<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Double")) {<span style="white-space:pre"></span>double value = ((Double) v).doubleValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Float")) {<span style="white-space:pre"></span>float value = ((Float) v).floatValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Long")) {<span style="white-space:pre"></span>long value = Long.valueOf(v.toString());<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Boolean")) {<span style="white-space:pre"></span>boolean value = ((Boolean) v).booleanValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.util.Short")) {<span style="white-space:pre"></span>Short value = (Short) v;<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.util.Date")) {<span style="white-space:pre"></span>if (v instanceof Date) {<span style="white-space:pre"></span>Date value = (Date) v;<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (v instanceof Long) {<span style="white-space:pre"></span>long lv = Long.valueOf(v.toString());<span style="white-space:pre"></span>Date value = DateUtil.format2Date(lv);<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (v instanceof String) {<span style="white-space:pre"></span>Date value = DateUtil.formatStrToDate(v.toString(), "yyyymmdd hh:mm:ss");<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (v instanceof Integer) {<span style="white-space:pre"></span>long lv = Long.valueOf(v.toString());<span style="white-space:pre"></span>Date value = DateUtil.format2Date(lv);<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>method.invoke(obj, v);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} catch (Exception e) {<span style="white-space:pre"></span>logger.error("属性值装入失败,装入方法:" + cla + "." + method.getName() + ".可装入类型" + clas[0] + ";欲装入值的类型:" + v.getClass());<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return obj;<span style="white-space:pre"></span>}        /**     * 将map转换成Bean,Bean的属性名与map的key值对应时不区分大小写,并对map中key做忽略OMIT_REG正则处理     *      * @param <E>     * @param cla     * @param map     * @return     */    @SuppressWarnings({"rawtypes"})<span style="white-space:pre"></span>public static <E> E toBean(Class<E> cla, Map<String, Object> map, Map<String, Object> mapping) {<span style="white-space:pre"></span>// 创建对象<span style="white-space:pre"></span>E obj = null;<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>obj = cla.newInstance();<span style="white-space:pre"></span>if (obj == null) {<span style="white-space:pre"></span>throw new Exception();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} catch (Exception e) {<span style="white-space:pre"></span>logger.error("类型实例化对象失败,类型:" + cla);<span style="white-space:pre"></span>return null;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>// 处理map的key<span style="white-space:pre"></span>Map<String, Object> newmap = new HashMap<String, Object>();<span style="white-space:pre"></span>for (Map.Entry<String, Object> en : map.entrySet()) {<span style="white-space:pre"></span>// 列转化<span style="white-space:pre"></span>String sourceKey = en.getKey();<span style="white-space:pre"></span>if (null != mapping.get(sourceKey)) {<span style="white-space:pre"></span>newmap.put("set" + (mapping.get(sourceKey).toString()).trim().replaceAll(OMIT_REG, "").toLowerCase(), en.getValue());<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>newmap.put("set" + en.getKey().trim().replaceAll(OMIT_REG, "").toLowerCase(), en.getValue());<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>// 进行值装入<span style="white-space:pre"></span>Method[] ms = cla.getMethods();<span style="white-space:pre"></span>for (Method method : ms) {<span style="white-space:pre"></span>String mname = method.getName().toLowerCase();<span style="white-space:pre"></span>if (mname.startsWith("set")) {<span style="white-space:pre"></span>Class[] clas = method.getParameterTypes();<span style="white-space:pre"></span>Object v = newmap.get(mname);<span style="white-space:pre"></span>if (v != null && clas.length == 1) {<span style="white-space:pre"></span>String type = clas[0].toString();<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>if (type.equals("class java.lang.Integer")) {<span style="white-space:pre"></span>int value = ((Integer) v).intValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.String")) {<span style="white-space:pre"></span>String value = (String) v;<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Double")) {<span style="white-space:pre"></span>double value = ((Double) v).doubleValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Float")) {<span style="white-space:pre"></span>float value = ((Float) v).floatValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Long")) {<span style="white-space:pre"></span>long value = Long.valueOf(v.toString());<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.lang.Boolean")) {<span style="white-space:pre"></span>boolean value = ((Boolean) v).booleanValue();<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.util.Short")) {<span style="white-space:pre"></span>Short value = (Short) v;<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (type.equals("class java.util.Date")) {<span style="white-space:pre"></span>if (v instanceof Date) {<span style="white-space:pre"></span>Date value = (Date) v;<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (v instanceof Long) {<span style="white-space:pre"></span>long lv = Long.valueOf(v.toString());<span style="white-space:pre"></span>Date value = DateUtil.format2Date(lv);<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (v instanceof String) {<span style="white-space:pre"></span>Date value = DateUtil.formatStrToDate(v.toString(), "yyyymmdd hh:mm:ss");<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>} else if (v instanceof Integer) {<span style="white-space:pre"></span>long lv = Long.valueOf(v.toString());<span style="white-space:pre"></span>Date value = DateUtil.format2Date(lv);<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>method.invoke(obj, v);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} catch (Exception e) {<span style="white-space:pre"></span>logger.error("属性值装入失败,装入方法:" + cla + "." + method.getName() + ".可装入类型" + clas[0] + ";欲装入值的类型:" + v.getClass());<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return obj;<span style="white-space:pre"></span>}        /**     * 将一个 JavaBean 对象转化为一个 Map     *      * @param bean要转化的JavaBean 对象     * @return 转化出来的 Map 对象     * @throws IntrospectionException如果分析类属性失败     * @throws IllegalAccessException如果实例化 JavaBean 失败     * @throws InvocationTargetException如果调用属性的 setter 方法失败     */    @SuppressWarnings({"rawtypes", "unchecked"})    public static Map convertBeanToMap(Object bean, boolean isNull) throws IntrospectionException, IllegalAccessException, InvocationTargetException {<span style="white-space:pre"></span>Class type = bean.getClass();<span style="white-space:pre"></span>Map returnMap = new HashMap();<span style="white-space:pre"></span>BeanInfo beanInfo = Introspector.getBeanInfo(type);<span style="white-space:pre"></span>PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();<span style="white-space:pre"></span>for (int i = 0; i < propertyDescriptors.length; i++) {<span style="white-space:pre"></span>PropertyDescriptor descriptor = propertyDescriptors[i];<span style="white-space:pre"></span>String propertyName = descriptor.getName();<span style="white-space:pre"></span>if (!propertyName.equals("class")) {<span style="white-space:pre"></span>Method readMethod = descriptor.getReadMethod();<span style="white-space:pre"></span>if(null!=readMethod){<span style="white-space:pre"></span>Object result = readMethod.invoke(bean, new Object[0]);<span style="white-space:pre"></span>if (isNull && "".equals(String.valueOf(result))) {<span style="white-space:pre"></span>returnMap.put(propertyName, null);<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>returnMap.put(propertyName, result);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return returnMap;<span style="white-space:pre"></span>}    /**     * 将一个 Map 对象转化为一个 JavaBean 〈一句话功能简述〉 〈功能详细描述〉     *      * @param type     * @param map     * @return     * @throws IntrospectionException     * @throws IllegalAccessException     * @throws InstantiationException     * @throws InvocationTargetExceptionObject 如果有违例,请使用@exception/throws [违例类型][违例说明:异常的注释必须说明该异常的含义及什么条件下抛出该     * @see [类、类#方法、类#成员]     */    @SuppressWarnings("rawtypes")<span style="white-space:pre"></span>public static Object convertMapToBean(Class type, Map map) throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {<span style="white-space:pre"></span>BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性<span style="white-space:pre"></span>Object obj = type.newInstance(); // 创建 JavaBean 对象<span style="white-space:pre"></span>// 给 JavaBean 对象的属性赋值<span style="white-space:pre"></span>PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();<span style="white-space:pre"></span>for (int i = 0; i < propertyDescriptors.length; i++) {<span style="white-space:pre"></span>PropertyDescriptor descriptor = propertyDescriptors[i];<span style="white-space:pre"></span>String propertyName = descriptor.getName();<span style="white-space:pre"></span>if (map.containsKey(propertyName)) {<span style="white-space:pre"></span>// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。<span style="white-space:pre"></span>Object value = map.get(propertyName);<span style="white-space:pre"></span>Object[] args = new Object[1];<span style="white-space:pre"></span>args[0] = value;<span style="white-space:pre"></span>descriptor.getWriteMethod().invoke(obj, args);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return obj;<span style="white-space:pre"></span>}        /**     * 将一个 Map 对象转化为一个 JavaBean 〈一句话功能简述〉 〈功能详细描述〉     *      * @param type     * @param map     * @return     * @throws IntrospectionException     * @throws IllegalAccessException     * @throws InstantiationException     * @throws InvocationTargetExceptionObject 如果有违例,请使用@exception/throws [违例类型][违例说明:异常的注释必须说明该异常的含义及什么条件下抛出该     * @see [类、类#方法、类#成员]     */    @SuppressWarnings("rawtypes")<span style="white-space:pre"></span>public static Object convertMapToBean(Class type, Map map, Map<String, Object> mapping) throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {<span style="white-space:pre"></span>BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性<span style="white-space:pre"></span>Object obj = type.newInstance(); // 创建 JavaBean 对象<span style="white-space:pre"></span>// 给 JavaBean 对象的属性赋值<span style="white-space:pre"></span>PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();<span style="white-space:pre"></span>for (int i = 0; i < propertyDescriptors.length; i++) {<span style="white-space:pre"></span>PropertyDescriptor descriptor = propertyDescriptors[i];<span style="white-space:pre"></span>String propertyName = descriptor.getName();<span style="white-space:pre"></span>if (map.containsKey(propertyName)) {<span style="white-space:pre"></span>// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。<span style="white-space:pre"></span>Object value = map.get(propertyName);<span style="white-space:pre"></span>Object[] args = new Object[1];<span style="white-space:pre"></span>args[0] = value;<span style="white-space:pre"></span>descriptor.getWriteMethod().invoke(obj, args);<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>for (Map.Entry<String, Object> entry : mapping.entrySet()) {<span style="white-space:pre"></span>String sourceKey = entry.getKey();<span style="white-space:pre"></span>String toKey = String.valueOf(entry.getValue());<span style="white-space:pre"></span>if (propertyName.equalsIgnoreCase(sourceKey)) {<span style="white-space:pre"></span>// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。<span style="white-space:pre"></span>Object value = map.get(propertyName);<span style="white-space:pre"></span>Object[] args = new Object[1];<span style="white-space:pre"></span>args[0] = value;<span style="white-space:pre"></span>descriptor.getWriteMethod().invoke(obj, args);<span style="white-space:pre"></span>} else if (propertyName.equalsIgnoreCase(toKey)) {<span style="white-space:pre"></span>// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。<span style="white-space:pre"></span>Object value = map.get(propertyName);<span style="white-space:pre"></span>Object[] args = new Object[1];<span style="white-space:pre"></span>args[0] = value;<span style="white-space:pre"></span>descriptor.getWriteMethod().invoke(obj, args);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return obj;<span style="white-space:pre"></span>}    /**     * 输入Map,输出Bean对象 new Bean(); MapObjectUtil.mapToObject(入参Map,出参Bean); 〈一句话功能简述〉 〈功能详细描述〉     *      * @param map     * @param classPath     * @param obj void 如果有违例,请使用@exception/throws [违例类型][违例说明:异常的注释必须说明该异常的含义及什么条件下抛出该     * @see [类、类#方法、类#成员]     */<span style="white-space:pre"></span>public static void mapToObject(Map<String, Object> map, String classPath, Object obj) {<span style="white-space:pre"></span>@SuppressWarnings("rawtypes")<span style="white-space:pre"></span>Class clazz = null;<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>clazz = Class.forName(obj.getClass().getName());<span style="white-space:pre"></span>Field[] fields = clazz.getDeclaredFields();<span style="white-space:pre"></span>for (int i = 0; i < fields.length; i++) {<span style="white-space:pre"></span>String varName = fields[i].getName();<span style="white-space:pre"></span>Object value = map.get(varName);<span style="white-space:pre"></span>if (null != value) {<span style="white-space:pre"></span>@SuppressWarnings("unchecked")<span style="white-space:pre"></span>Method method = clazz.getMethod("set" + varName.toUpperCase().charAt(0) + varName.subSequence(1, varName.length()), String.class);<span style="white-space:pre"></span>method.invoke(obj, value);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} catch (Exception e) {<span style="white-space:pre"></span>e.printStackTrace();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}}

同时把Json字符串的常用处理方式做个记录 

                JSONObject jasonObject = JSONObject.fromObject(keywordAdd);Map<String,String> accountInfo = (Map<String, String>) jasonObject.get("accountInfo");String[] accountLogin = new String[3];accountLogin[0] = accountInfo.get("username");accountLogin[1] = accountInfo.get("password");accountLogin[2] = accountInfo.get("token");





1 0
原创粉丝点击