JSON數據的幾種解析方式

對於簡單的json字符串或者數組數據,可以用:JsonObject和JsonArray

使用以上兩種方式解析json均需要依賴json-lib.jar開發包使用依賴包

1、如果只是一條簡單的json數據,可以直接用JsonObject即可

使用JsonObject解析只有一條數據的json是非常方便的例如:"{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"[email protected]\"}"

  1. public static void main(String[] args) {  
  2.  
  3.          String jsonString ="{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"[email protected]\"}";  
  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\":\"[email protected]\"},{\"name\":\"lisi\",\"password\":\"lisi123\",\"email\":\"[email protected]\"}]"

  1. String json = <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">"[{\"name\":\"zhangsan\",\"password\":\"zhangsan123\",\"email\":\"[email protected]\"},</span><span style="color: rgb(515151); font-family: Arial; font-size: 14px; line-height: 26px;">{\"name\":\"lisi\",\"password\":\"lisi123\",\"email\":\"[email protected]\"}</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]]]]

 * */


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章