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()); } }