调用Jackson一行解析海量复杂结构的json数据

来源:互联网 发布:iphone 163 smtp端口 编辑:程序博客网 时间:2024/06/05 03:28

下面是我学习jackson之后总结了诸多失败之后总结出的一个超级方便将json解析为对象的方法




package com.example.jacksondemo;


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import com.djl.utils.JackSonUtil;
import com.example.jacksondemo.R;

/**
 *
 * @author DJL
 * @since 2015/03/19 11:01
 * @version 1.0 这里需要注意1.实体bean的结构必须与json中的数据结构一。2.实体bean中的数据名称必须与json中对应的关键词一至
 *
 */
public class MainActivity extends Activity {

    private ArrayList<CategoryBean> categorys;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InputStream is;
        try {
            // 获取json数据流
            is = getAssets().open("demo.json");
            // 海量json数据,一行瞬间解析,这种feel谁用谁知道
            JsonBaseBean baseBean = JackSonUtil.parse(JsonBaseBean.class, is);
            categorys = baseBean.deals;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 这里我仅做一下解析出的数据的简单展示,具体的用处你们比我清楚
        StringBuilder sb = new StringBuilder();
        for (CategoryBean c : categorys) {
            sb.append("\n categorys").append(c.toString()).append("\n\n\n");
        }
        TextView tv = (TextView) findViewById(R.id.tv);

        tv.setText(sb.toString());
    }
}

下面是jsonutils

package com.djl.utils;

import java.io.IOException;
import java.io.InputStream;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

import android.util.Log;

/**
 *
 * @author DJL
 * @since 2014/10/25 18:33
 * @version 1.0 这里需要注意1.实体bean的结构必须与json中的数据结构一。2.实体bean中的数据名称必须与json中对应的关键词一至
 *
 */
public class JackSonUtil {
    /**
     * @author Djl
     * @param clazz
     *            需要解析成的bean类型 改bean类型必须实现Serializable接口
     * @param is
     *            json的输入流
     * @return 返回解析成的bean对象 例: Djl p = JackSonUtil.parse(Djl.class, is);
     */
    public static <T> T parse(Class<T> clazz, InputStream is) {
        ObjectMapper mapper = new ObjectMapper().setVisibility(
                JsonMethod.FIELD, Visibility.ANY);
        T result = null;
        try {
            /**
             * true可以设置私有变量
             */
            mapper.configure(
                    DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
                    true);
            /**
             * 与未定义的属相有关
             */
            mapper.configure(
                    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                    false);
            result = mapper.readValue(is, clazz);
        } catch (JsonParseException e) {
            Log.e("JackSonUtil", e.getMessage());
        } catch (JsonMappingException e) {
            Log.e("JackSonUtil", e.getMessage());
        } catch (IOException e) {
            Log.e("JackSonUtil", e.getMessage());
        }
        return result;
    }

    /**
     * @author Djl
     * @param clazz
     *            需要解析成的bean类型 改bean类型必须实现Serializable接口
     * @param json
     *            json文本
     * @return 返回解析成的bean对象 例: Djl p = JackSonUtil.parse(Djl.class, is);
     */
    public static <T> T parse(Class<T> clazz, String json) {
        ObjectMapper mapper = new ObjectMapper().setVisibility(
                JsonMethod.FIELD, Visibility.ANY);
        T result = null;
        try {
            /**
             * true可以设置私有变量
             */
            mapper.configure(
                    DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
                    true);
            /**
             * 与未定义的属相有关
             */
            mapper.configure(
                    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                    false);
            result = mapper.readValue(json, clazz);
        } catch (JsonParseException e) {
            Log.e("JackSonUtil", e.getMessage());
        } catch (JsonMappingException e) {
            Log.e("JackSonUtil", e.getMessage());
        } catch (IOException e) {
            Log.e("JackSonUtil", e.getMessage());
        }
        return result;
    }
}
Demo下载 https://github.com/djl123581/DjlPrivate.git

0 0