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

下面是我学习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值