当前位置:   article > 正文

JSON数据的几种解析方式_constructparametrictype

constructparametrictype

对于简单的json字符串或者数组数据,可以用:JsonObject和JsonArray

使用以上两种方式解析json均需要依赖json-lib.jar开发包使用依赖包

1、如果只是一条简单的json数据,可以直接用JsonObject即可

使用JsonObject解析只有一条数据的json是非常方便的例如:"{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"10371443@qq.com\"}"

  1. public static void main(String[] args) {  
  2.  
  3.          String jsonString ="{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"10371443@qq.com\"}";  
  4.          JSONObject json = JSONObject.fromObject(jsonString);  
  5.          User user = new User();  
  6.          user.setName(json.getString("name"));  
  7.          user.setPassword(json.getString("password"));  
  8.          user.setEmail(json.getString("email"));  
  9.          System.out.println(user.toString());  
  10.     }  

2、如果是数组数据的json,用JsonArray比较合适

使用JsonArray解析数组数据的json是非常方便的例如:"[{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"10371443@qq.com\"},{\"name\":\"lisi\",\"password\":\"lisi123\",\"email\":\"1435123@qq.com\"}]"

  1. String json = <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">"[{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"10371443@qq.com\"},</span><span style="color: rgb(515151); font-family: Arial; font-size: 14px; line-height: 26px;">{\"name\":\"lisi\",\"password\":\"lisi123\",\"email\":\"1435123@qq.com\"}</span><span style="color: rgb(515151); font-family: Arial; font-size: 14px; line-height: 26px;">]"</span>;  
  2.          JSONArray jsonArray = JSONArray.fromObject(json);  
  3.          ArrayList<User> users = new ArrayList<User>();  
  4.          for (int i = 0; i < jsonArray.size(); i++) {  
  5.              User userM = new User();  
  6.              user.setName(jsonArray.getJSONObject(i).getString("name"));  
  7.              user.setpassword(jsonArray.getJSONObject(i).getString("password"));  
  8.              user.setEmail(jsonArray.getJSONObject(i).getString("email"));  
  9.              users.add(user);  
  10.         }  
  11.          for (User user : users) {  
  12.             System.out.println(user.toString());  
  13.         } 

3、对于复杂的json数据,需要借助jackson框架,先泛型转化,再readValue

Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现。但是如果要转换复杂类型Collection如 List<YourBean>,那么就需要先反序列化复杂类型 为泛型的Collection Type

如果是ArrayList<YourBean>那么使用ObjectMapper 的getTypeFactory().constructParametricType(collectionClass, elementClasses);

如果是HashMap<String,YourBean>那么ObjectMapper

的getTypeFactory().constructParametricType(HashMap.class,String.class, YourBean.class);

 实例简介一:

jackjson 和 java对象的转化,先泛型化再readValue

String TaskStr = getTaskListFile (task,id, false );

// DeserializationFeature. FAIL_ON_UNKNOWN_PROPERTIES , false ,避免在转化为class对象时,没有关联的
//属性匹配而报异常
objectMapper .configure(DeserializationFeature. FAIL_ON_UNKNOWN_PROPERTIES , false );

//将TaskDO对象泛型化list---List<TaskDO>
JavaType TaskDOType = objectMapper .getTypeFactory().constructParametricType(ArrayList. class , TaskDO. class );

//将List<TaskDO>泛型化Response<List<TaskDO>>
JavaType responseType = objectMapper .getTypeFactory().constructParametricType(Response. class , TaskDOType);

//最后将字符串,按Response<List<TaskDO>>这个类型,给转化
//成Response<List<TaskDO>>
Response<List<TaskDO>> response = (Response<List<TaskDO>>) objectMapper .readValue(TaskStr, responseType);


实例详解二:

package com;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * jackson 复杂 对象集合 的几种简单转换
 * @author lenovo
 *
 * @param <T>
 */
public class Main<T>
{
    static ObjectMapper mapper = new ObjectMapper();

    public static void main(String[] args) throws JsonParseException,
            JsonMappingException, IOException
    {

        String josn = "{\"UserID\":1,\"LoginName\":\"唐工\",\"Truename\":\"超级\",\"Nickname\":null,\"LoginPwd\":\"E10ADC3949BA59ABBE56E057F20F883E\",\"QQ\":\"\",\"Phone\":\"\",\"Email\":null,\"Remark\":\"\",\"Account_Non_Locked\":0,\"Telelephone\":null,\"IsDelete\":0}";
        User u = mapper.readValue(josn, User.class);
        // User u=new Main<User>().jsonStreamConverObject(josn, User.class);
        System.out.println("转对象:" + u);

        // 转集合
        String josn2 = "[{\"UserID\":1,\"LoginName\":\"唐工\",\"Truename\":\"超级\",\"Nickname\":null,\"LoginPwd\":\"E10ADC3949BA59ABBE56E057F20F883E\",\"QQ\":\"\",\"Phone\":\"\",\"Email\":null,\"Remark\":\"\",\"Account_Non_Locked\":0,\"Telelephone\":null,\"IsDelete\":0}]";
        JavaType javaType = mapper.getTypeFactory().constructParametricType(
                List.class, User.class);
        List<User> me = mapper.readValue(josn2, javaType);
        System.out.println("转集合me:" + me);

        // 对象里有 集合 转换
        String josn3 = "{\"UserID\":1,\"LoginName\":\"唐工\",\"Truename\":\"超级\",\"Nickname\":null,\"LoginPwd\":\"E10ADC3949BA59ABBE56E057F20F883E\",\"QQ\":\"\",\"Phone\":\"\",\"Email\":null,\"Remark\":\"\",\"Account_Non_Locked\":0,\"Telelephone\":null,\"IsDelete\":0,\"RoleList\":[{\"Roleid\":0,\"Name\":\"超级管理员\",\"Show_Name\":\"超级管理员\",\"Remark\":null,\"Type\":1}]}";

        User u3 = mapper.readValue(josn3, User.class); // 简单方式
        // User u3=new Main<User>().jsonConverObject(josn3, User.class); 流方式
        System.out.println("转对象里有集合u3:" + u3);

        // 集合 对象 集合 转换
        String josn4 = "[{\"UserID\":1,\"LoginName\":\"唐工\",\"Truename\":\"超级\",\"Nickname\":null,\"LoginPwd\":\"E10ADC3949BA59ABBE56E057F20F883E\",\"QQ\":\"\",\"Phone\":\"\",\"Email\":null,\"Remark\":\"\",\"Account_Non_Locked\":0,\"Telelephone\":null,\"IsDelete\":0,\"RoleList\":[{\"Roleid\":0,\"Name\":\"超级管理员\",\"Show_Name\":\"超级管理员\",\"Remark\":null,\"Type\":1}]},{\"UserID\":2,\"LoginName\":\"唐工\",\"Truename\":\"超级\",\"Nickname\":null,\"LoginPwd\":\"E10ADC3949BA59ABBE56E057F20F883E\",\"QQ\":\"\",\"Phone\":\"\",\"Email\":null,\"Remark\":\"\",\"Account_Non_Locked\":0,\"Telelephone\":null,\"IsDelete\":0,\"RoleList\":[{\"Roleid\":0,\"Name\":\"超级管理员\",\"Show_Name\":\"超级管理员\",\"Remark\":null,\"Type\":1}]}]";
        JavaType javaType4 = mapper.getTypeFactory().constructParametricType(
                List.class, User.class);
        List<User> list = mapper.readValue(josn4, javaType4);
        System.out.println("集合里是对象 对象里有集合转换:" + list);

    }

    /***
     * 转对象
     * @param josn
     * @param clz
     * @return
     */
    public T jsonStreamConverObject(String josn, Class<T> clz)
    {

        T t = null;
        // ObjectMapper jacksonMapper = new ObjectMapper();
        InputStreamReader in = new InputStreamReader(new ByteArrayInputStream(
                josn.getBytes()));
        BufferedReader streamReader = new BufferedReader(in);
        StringBuilder buff = new StringBuilder();
        String inputStr;
        try
        {
            while ((inputStr = streamReader.readLine()) != null)
                buff.append(inputStr);
            // ObjectMapper mapper = new ObjectMapper();
            t = mapper.readValue(buff.toString(), clz);

        } catch (IOException e)
        {

            e.printStackTrace();
        }

        return t;
    }

    /***
     * 转对象
     * @param josn
     * @param clz
     * @return
     */
    public T jsonConverObject(String josn, Class<T> clz)
    {

        T t = null;
        try
        {
            t = mapper.readValue(josn, clz);
        } catch (JsonParseException e)
        {
            e.printStackTrace();
        } catch (JsonMappingException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }

        return t;
    }

    /**
     * 转集合
     * @param josn
     * @param clz
     * @return
     */
    public List<T> jsonConverList(String josn, Class<T> clz)
    {

        List<T> me = null;
        try
        {
            // jacksonMapper
            // .disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
            // jacksonMapper.enableDefaultTyping();
            // jacksonMapper.setVisibility(JsonMethod.FIELD,JsonAutoDetect.Visibility.ANY);
            // jacksonMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT,
            // false);//格式化
            // jacksonMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
            // jacksonMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS,
            // false);

            JavaType javaType = mapper.getTypeFactory()
                    .constructParametricType(List.class, clz);// clz.selGenType().getClass()

            me = mapper.readValue(josn, javaType);
        } catch (JsonParseException e)
        {
            e.printStackTrace();
        } catch (JsonMappingException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }

        return me;
    }
}

/**
 * output:
 * 转对象:User [UserID=1, LoginName=唐工, Truename=超级, Nickname=null, LoginPwd=E10ADC3949BA59ABBE56E057F20F883E, QQ=, Phone=, Email=null, Remark=, Account_Non_Locked=0, Telelephone=null, Indate=null, IsDelete=0, RoleList=null]
 * 转集合me:[User [UserID=1, LoginName=唐工, Truename=超级, Nickname=null, LoginPwd=E10ADC3949BA59ABBE56E057F20F883E, QQ=, Phone=, Email=null, Remark=, Account_Non_Locked=0, Telelephone=null, Indate=null, IsDelete=0, RoleList=null]]
 * 转对象里有集合u3:User [UserID=1, LoginName=唐工, Truename=超级, Nickname=null, LoginPwd=E10ADC3949BA59ABBE56E057F20F883E, QQ=, Phone=, Email=null, Remark=, Account_Non_Locked=0, Telelephone=null, Indate=null, IsDelete=0, RoleList=[Role [Roleid=0, Name=超级管理员, Show_Name=超级管理员, Remark=null, Type=1]]]
 * 集合里是对象 对象里有集合转换:[User [UserID=1, LoginName=唐工, Truename=超级, Nickname=null, LoginPwd=E10ADC3949BA59ABBE56E057F20F883E, QQ=, Phone=, Email=null, Remark=, Account_Non_Locked=0, Telelephone=null, Indate=null, IsDelete=0, RoleList=[Role [Roleid=0, Name=超级管理员, Show_Name=超级管理员, Remark=null, Type=1]]], User [UserID=2, LoginName=唐工, Truename=超级, Nickname=null, LoginPwd=E10ADC3949BA59ABBE56E057F20F883E, QQ=, Phone=, Email=null, Remark=, Account_Non_Locked=0, Telelephone=null, Indate=null, IsDelete=0, RoleList=[Role [Roleid=0, Name=超级管理员, Show_Name=超级管理员, Remark=null, Type=1]]]]

 * */


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/351707
推荐阅读
相关标签
  

闽ICP备14008679号