一个递归parse json的方法

json主要有两种形式,分别是object和array,采用递归解析json字符串。

import org.codehaus.jackson.JsonParser;


public interface ValueParser {

    public ValueBean parse(JsonParser jsonParser);
}
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;

public class BaseValueParser implements ValueParser {

    public BaseValueParser(){
        super();
    }

    protected Map parseObject(JsonParser jsonParser) throws JsonParseException, IOException {
        JsonToken jsonToken = jsonParser.getCurrentToken();
        if (jsonToken == null) {
            jsonToken = jsonParser.nextToken();
        }
        Map<String, Object> object = new HashMap<String, Object>();

        while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) {

            String key = jsonParser.getText();
            JsonToken nextToken = jsonParser.nextToken();

            if (isSimpleValue(nextToken)) {
                String value = jsonParser.getText();
                object.put(key, value);
            } else {
                ValueBean vb = parse(jsonParser);
                Object value = vb.isObject() ? vb.getObject() : vb.getArray();
                object.put(key, value);
            }
        }
        return object;
    }

    protected List<Object> parseArray(JsonParser jsonParser) throws JsonParseException, IOException {
        JsonToken jsonToken = jsonParser.getCurrentToken();
        if (jsonToken == null) {
            jsonToken = jsonParser.nextToken();
        }

        List<Object> list = new ArrayList<Object>();
        while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_ARRAY) {
            if (isSimpleValue(jsonToken)) {
                String value = jsonParser.getText();
                list.add(value);
            } else {
                ValueBean vb = parse(jsonParser);
                Object value = vb.isObject() ? vb.getObject() : vb.getArray();
                list.add(value);

            }
        }
        return list;
    }

    protected boolean isSimpleValue(JsonToken jsonToken) {
        return !jsonToken.equals(JsonToken.START_ARRAY) && !jsonToken.equals(JsonToken.START_OBJECT);
    }
    
    public ValueBean parse(JsonParser jsonParser) {
        ValueBean vb = new ValueBean();
        try {
            JsonToken jsonToken = jsonParser.getCurrentToken();
            if (jsonToken == null) {
                jsonToken = jsonParser.nextToken();
            }
            if (JsonToken.START_OBJECT.equals(jsonToken)) {
                vb.setObject(parseObject(jsonParser));
                return vb;
            } else if (JsonToken.START_ARRAY.equals(jsonToken)) {
                vb.setArray(parseArray(jsonParser));
                return vb;
            } else {
                throw new RuntimeException("parser json error,jsonParser is" + jsonParser);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

单元测试

import org.codehaus.jackson.JsonParser;
import com.duitang.dboss.resolve.BaseDataResolverFactory;
import com.duitang.dboss.resolve.DataResolverFactory;

public class ValueParseTester {

    public static void main(String[] args) {

        ValueParser parser = new BaseValueParser();
        DataResolverFactory dataResolverFactory = new BaseDataResolverFactory();
        JsonParser jsonParser = dataResolverFactory.getJsonParser("{'tagSet': ['a', 'b'], 'page': '1'}");
        ValueBean result = parser.parse(jsonParser);
        System.out.println(result.getObject());
        jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [1, 2], 'page': '1'}");
        result = parser.parse(jsonParser);
        System.out.println(result.getObject());
        jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [1.12, 2.34], 'page': '1'}");
        result = parser.parse(jsonParser);
        System.out.println(result.getObject());
        jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [{'id':1,'name':2}], 'page': '1'}");
        result = parser.parse(jsonParser);
        System.out.println(result.getObject());
    }
}
 

猜你喜欢

转载自san-yun.iteye.com/blog/1762916