苹果手机苹果7怎么设置一键拨号快速拨号

您所在的位置: &
Android开发:Json字符串到Json对象万能解析器
Android开发:Json字符串到Json对象万能解析器
本文介绍了如何用Java实现Json字符串到Json对象万能解析器,即通过CommonJSONParser可以把json字符串转换为包含Map、List、String、Integer等标准Java对象的集合。
json字符串到json对象万能转换器(java实现),就一百来行代码,非常轻量小巧。对于一般应用场景资源消耗非常低,速度也足够快,尤其适用于Android应用开发。
通过CommonJSONParser可以把json字符串转换为包含Map、List、String、Integer等标准Java对象的集合,具体使用方法:
CommonJSONParser commonJSONParser = new
CommonJSONParser();
&&Map&String, Object& result =
commonJSONParser.parse(jsonDataStr);
CommonJSONParser源代码如下(主要使用&递归&思想):
1 import&java.util.ArrayL&&2&import&java.util.HashM&&3&import&java.util.I&&4&import&java.util.L&&5&import&java.util.M&&6&&&7&import&org.json.JSONA&&8&import&org.json.JSONE&&9&import&org.json.JSONO&10&&11&public&class&CommonJSONParser&{&12&&13&&&&&public&Map&String,&Object&&parse(String&jsonStr)&{&14&&15&&&&&&&&&Map&String,&Object&&result&=&null;&16&&17&&&&&&&&&if&(null&!=&jsonStr)&{&18&&&&&&&&&&&&&try&{&19&&20&&&&&&&&&&&&&&&&&JSONObject&jsonObject&=&new&JSONObject(jsonStr);&21&&&&&&&&&&&&&&&&&result&=&parseJSONObject(jsonObject);&22&&23&&&&&&&&&&&&&}&catch&(JSONException&e)&{&24&&&&&&&&&&&&&&&&&&25&&&&&&&&&&&&&&&&&e.printStackTrace();&26&&&&&&&&&&&&&}&27&&&&&&&&&}&&28&&29&&&&&&&&&return&&30&&&&&}&31&&32&&&&&private&Object&parseValue(Object&inputObject)&throws&JSONException&{&33&&&&&&&&&Object&outputObject&=&null;&34&&35&&&&&&&&&if&(null&!=&inputObject)&{&36&&37&&&&&&&&&&&&&if&(inputObject&instanceof&JSONArray)&{&38&&&&&&&&&&&&&&&&&outputObject&=&parseJSONArray((JSONArray)&inputObject);&39&&&&&&&&&&&&&}&else&if&(inputObject&instanceof&JSONObject)&{&40&&&&&&&&&&&&&&&&&outputObject&=&parseJSONObject((JSONObject)&inputObject);&41&&&&&&&&&&&&&}&else&if&(inputObject&instanceof&String&||&inputObject&instanceof&Boolean&||&inputObject&instanceof&Integer)&{&42&&&&&&&&&&&&&&&&&outputObject&=&inputO&43&&&&&&&&&&&&&}&44&&45&&&&&&&&&}&46&&47&&&&&&&&&return&outputO&48&&&&&}&49&&50&&&&&private&List&Object&&parseJSONArray(JSONArray&jsonArray)&throws&JSONException&{&51&&52&&&&&&&&&List&Object&&valueList&=&null;&53&&54&&&&&&&&&if&(null&!=&jsonArray)&{&55&&&&&&&&&&&&&valueList&=&new&ArrayList&Object&();&56&&57&&&&&&&&&&&&&for&(int&i&=&0;&i&&&jsonArray.length();&i++)&{&58&&&&&&&&&&&&&&&&&Object&itemObject&=&jsonArray.get(i);&59&&&&&&&&&&&&&&&&&if&(null&!=&itemObject)&{&60&&&&&&&&&&&&&&&&&&&&&valueList.add(parseValue(itemObject));&61&&&&&&&&&&&&&&&&&}&62&&&&&&&&&&&&&}&&63&&&&&&&&&}&&64&&65&&&&&&&&&return&valueL&66&&&&&}&67&&68&&&&&private&Map&String,&Object&&parseJSONObject(JSONObject&jsonObject)&throws&JSONException&{&69&&70&&&&&&&&&Map&String,&Object&&valueObject&=&null;&71&&&&&&&&&if&(null&!=&jsonObject)&{&72&&&&&&&&&&&&&valueObject&=&new&HashMap&String,&Object&();&73&&74&&&&&&&&&&&&&Iterator&String&&keyIter&=&jsonObject.keys();&75&&&&&&&&&&&&&while&(keyIter.hasNext())&{&76&&&&&&&&&&&&&&&&&String&keyStr&=&keyIter.next();&77&&&&&&&&&&&&&&&&&Object&itemObject&=&jsonObject.opt(keyStr);&78&&&&&&&&&&&&&&&&&if&(null&!=&itemObject)&{&79&&&&&&&&&&&&&&&&&&&&&valueObject.put(keyStr,&parseValue(itemObject));&80&&&&&&&&&&&&&&&&&}&&81&&82&&&&&&&&&&&&&}&&83&&&&&&&&&}&&84&&85&&&&&&&&&return&valueO&86&&&&&}&87&}&
【编辑推荐】【责任编辑: TEL:(010)】
关于&&&&的更多文章
Android 4.4即将发布,这对大家来说都是很期待的,当然,无论是
在iOS开发过程中,尤其是对于新手来说,都会遇到或多
Web App开发中会面临越来越“重”的问题,如果在开始
作为Android开发者,最头疼是什么?相信大家会异口同
本书全面系统地概括了计算机网络的基本理论,详细阐述了OSI模型与网络协议、网络规划与综合布线、对等网络与服务器/客户端网络、
Windows Phone专家
Android开发专家
51CTO旗下网站如何编写一个JSON解析器 - 廖雪峰的官方网站
如何编写一个JSON解析器
/ Reads: 1045
编写一个JSON解析器实际上就是一个函数,它的输入是一个表示JSON的字符串,输出是结构化的对应到语言本身的数据结构。
和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对应的数据结构是:
&string&:Java的String;
number:Java的Long或Double;
true/false:Java的Boolean;
null:Java的null;
[array]:Java的List&Object&或Object[];
{&key&:&value&}:Java的Map&String, Object&。
解析JSON和解析XML类似,最终都是解析为内存的一个对象。出于效率考虑,使用流的方式几乎是唯一选择,也就是解析器只从头扫描一遍JSON字符串,就完整地解析出对应的数据结构。
本质上解析器就是一个状态机,只要按照JSON定义的格式(参考,正确实现状态转移即可。但是为了简化代码,我们也没必要完整地实现一个字符一个字符的状态转移。
解析器的输入应该是一个字符流,所以,第一步是获得Reader,以便能不断地读入下一个字符。
在解析的过程中,我们经常要根据下一个字符来决定状态跳转,此时又涉及到回退的问题,就是某些时候不能用next()取下一个字符,而是用peek()取下一个字符,但字符流的指针不移动。所以,Reader接口不能满足这个需求,应当进一步封装一个CharReader,它可以实现:
char next():读取下一个字符,移动Reader指针;
char peek():读取下一个字符,不移动Reader指针;
String next(int size):读取指定的N个字符并移动指针;
boolean hasMore():判断流是否结束。
JSON解析比其他文本解析要简单的地方在于,任何JSON数据类型,只需要根据下一个字符即可确定,仔细总结可以发现,如果peek()返回的字符是某个字符,就可以期望读取的数据类型:
{:期待一个JSON object;
::期待一个JSON object的value;
,:期待一个JSON object的下一组key-value,或者一个JSON array的下一个元素;
[:期待一个JSON array;
t:期待一个true;
f:期待一个false;
n:期待一个null;
&:期待一个string;
0~9:期待一个number。
但是单个字符要匹配的状态太多了,需要进一步把字符流变为Token,可以总结出如下几种Token:
END_DOCUMENT:JSON文档结束;
BEGIN_OBJECT:开始一个JSON object;
END_OBJECT:结束一个JSON object;
BEGIN_ARRAY:开始一个JSON array;
END_ARRAY:结束一个JSON array;
SEP_COLON:读取一个冒号;
SEP_COMMA:读取一个逗号;
STRING:一个String;
BOOLEAN:一个true或false;
NUMBER:一个number;
NULL:一个null。
然后,将CharReader进一步封装为TokenReader,提供以下接口:
Token readNextToken():读取下一个Token;
boolean readBoolean():读取一个boolean;
Number readNumber():读取一个number;
String readString():读取一个string;
void readNull():读取一个null。
由于JSON的Object和Array可以嵌套,在读取过程中,使用一个栈来存储Object和Array是必须的。每当我们读到一个BEGIN_OBJECT时,就创建一个Map并压栈;每当读到一个BEGIN_ARRAY时,就创建一个List并压栈;每当读到一个END_OBJECT和END_ARRAY时,就弹出栈顶元素,并根据新的栈顶元素判断是否压栈。此外,读到Object的Key也必须压栈,读到后面的Value后将Key-Value压入栈顶的Map。
如果读到END_DOCUMENT时,栈恰好只剩下一个元素,则读取正确,将该元素返回,读取结束。如果栈剩下不止一个元素,则JSON文档格式不正确。
最后,JsonReader的核心解析代码parse()就是负责从TokenReader中不断读取Token,根据当前状态操作,然后设定下一个Token期望的状态,如果与期望状态不符,则JSON的格式无效。起始状态被设定为STATUS_EXPECT_SINGLE_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY,即期望读取到单个value、{或[。循环的退出点是读取到END_DOCUMENT时。
public class JsonReader {
public Object parse() {
Stack stack = new Stack();
int status = STATUS_EXPECT_SINGLE_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY;
for (;;) {
Token currentToken = reader.readNextToken();
switch (currentToken) {
case BOOLEAN:
if (hasStatus(STATUS_EXPECT_SINGLE_VALUE)) {
// single boolean:
Boolean bool = reader.readBoolean();
stack.push(StackValue.newJsonSingle(bool));
status = STATUS_EXPECT_END_DOCUMENT;
if (hasStatus(STATUS_EXPECT_OBJECT_VALUE)) {
Boolean bool = reader.readBoolean();
String key = stack.pop(StackValue.TYPE_OBJECT_KEY).valueAsKey();
stack.peek(StackValue.TYPE_OBJECT).valueAsObject().put(key, bool);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT;
if (hasStatus(STATUS_EXPECT_ARRAY_VALUE)) {
Boolean bool = reader.readBoolean();
stack.peek(StackValue.TYPE_ARRAY).valueAsArray().add(bool);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected boolean.&, reader.reader.readed);
case NULL:
if (hasStatus(STATUS_EXPECT_SINGLE_VALUE)) {
// single null:
reader.readNull();
stack.push(StackValue.newJsonSingle(null));
status = STATUS_EXPECT_END_DOCUMENT;
if (hasStatus(STATUS_EXPECT_OBJECT_VALUE)) {
reader.readNull();
String key = stack.pop(StackValue.TYPE_OBJECT_KEY).valueAsKey();
stack.peek(StackValue.TYPE_OBJECT).valueAsObject().put(key, null);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT;
if (hasStatus(STATUS_EXPECT_ARRAY_VALUE)) {
reader.readNull();
stack.peek(StackValue.TYPE_ARRAY).valueAsArray().add(null);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected null.&, reader.reader.readed);
case NUMBER:
if (hasStatus(STATUS_EXPECT_SINGLE_VALUE)) {
// single number:
Number number = reader.readNumber();
stack.push(StackValue.newJsonSingle(number));
status = STATUS_EXPECT_END_DOCUMENT;
if (hasStatus(STATUS_EXPECT_OBJECT_VALUE)) {
Number number = reader.readNumber();
String key = stack.pop(StackValue.TYPE_OBJECT_KEY).valueAsKey();
stack.peek(StackValue.TYPE_OBJECT).valueAsObject().put(key, number);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT;
if (hasStatus(STATUS_EXPECT_ARRAY_VALUE)) {
Number number = reader.readNumber();
stack.peek(StackValue.TYPE_ARRAY).valueAsArray().add(number);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected number.&, reader.reader.readed);
case STRING:
if (hasStatus(STATUS_EXPECT_SINGLE_VALUE)) {
// single string:
String str = reader.readString();
stack.push(StackValue.newJsonSingle(str));
status = STATUS_EXPECT_END_DOCUMENT;
if (hasStatus(STATUS_EXPECT_OBJECT_KEY)) {
String str = reader.readString();
stack.push(StackValue.newJsonObjectKey(str));
status = STATUS_EXPECT_COLON;
if (hasStatus(STATUS_EXPECT_OBJECT_VALUE)) {
String str = reader.readString();
String key = stack.pop(StackValue.TYPE_OBJECT_KEY).valueAsKey();
stack.peek(StackValue.TYPE_OBJECT).valueAsObject().put(key, str);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT;
if (hasStatus(STATUS_EXPECT_ARRAY_VALUE)) {
String str = reader.readString();
stack.peek(StackValue.TYPE_ARRAY).valueAsArray().add(str);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected char \'\&\'.&, reader.reader.readed);
case SEP_COLON: // :
if (status == STATUS_EXPECT_COLON) {
status = STATUS_EXPECT_OBJECT_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY;
throw new JsonParseException(&Unexpected char \':\'.&, reader.reader.readed);
case SEP_COMMA: // ,
if (hasStatus(STATUS_EXPECT_COMMA)) {
if (hasStatus(STATUS_EXPECT_END_OBJECT)) {
status = STATUS_EXPECT_OBJECT_KEY;
if (hasStatus(STATUS_EXPECT_END_ARRAY)) {
status = STATUS_EXPECT_ARRAY_VALUE | STATUS_EXPECT_BEGIN_ARRAY | STATUS_EXPECT_BEGIN_OBJECT;
throw new JsonParseException(&Unexpected char \',\'.&, reader.reader.readed);
case END_ARRAY:
if (hasStatus(STATUS_EXPECT_END_ARRAY)) {
StackValue array = stack.pop(StackValue.TYPE_ARRAY);
if (stack.isEmpty()) {
stack.push(array);
status = STATUS_EXPECT_END_DOCUMENT;
int type = stack.getTopValueType();
if (type == StackValue.TYPE_OBJECT_KEY) {
// key: [ CURRENT ] ,}
String key = stack.pop(StackValue.TYPE_OBJECT_KEY).valueAsKey();
stack.peek(StackValue.TYPE_OBJECT).valueAsObject().put(key, array.value);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT;
if (type == StackValue.TYPE_ARRAY) {
// xx, xx, [CURRENT] ,]
stack.peek(StackValue.TYPE_ARRAY).valueAsArray().add(array.value);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected char: \']\'.&, reader.reader.readed);
case END_OBJECT:
if (hasStatus(STATUS_EXPECT_END_OBJECT)) {
StackValue object = stack.pop(StackValue.TYPE_OBJECT);
if (stack.isEmpty()) {
// root object:
stack.push(object);
status = STATUS_EXPECT_END_DOCUMENT;
int type = stack.getTopValueType();
if (type == StackValue.TYPE_OBJECT_KEY) {
String key = stack.pop(StackValue.TYPE_OBJECT_KEY).valueAsKey();
stack.peek(StackValue.TYPE_OBJECT).valueAsObject().put(key, object.value);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT;
if (type == StackValue.TYPE_ARRAY) {
stack.peek(StackValue.TYPE_ARRAY).valueAsArray().add(object.value);
status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected char: \'}\'.&, reader.reader.readed);
case END_DOCUMENT:
if (hasStatus(STATUS_EXPECT_END_DOCUMENT)) {
StackValue v = stack.pop();
if (stack.isEmpty()) {
throw new JsonParseException(&Unexpected EOF.&, reader.reader.readed);
case BEGIN_ARRAY:
if (hasStatus(STATUS_EXPECT_BEGIN_ARRAY)) {
stack.push(StackValue.newJsonArray(this.jsonArrayFactory.createJsonArray()));
status = STATUS_EXPECT_ARRAY_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY | STATUS_EXPECT_END_ARRAY;
throw new JsonParseException(&Unexpected char: \'[\'.&, reader.reader.readed);
case BEGIN_OBJECT:
if (hasStatus(STATUS_EXPECT_BEGIN_OBJECT)) {
stack.push(StackValue.newJsonObject(this.jsonObjectFactory.createJsonObject()));
status = STATUS_EXPECT_OBJECT_KEY | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_END_OBJECT;
throw new JsonParseException(&Unexpected char: \'{\'.&, reader.reader.readed);
详细源码请参考:。
Make a Comment
Sign In to Make a Comment
You can sign in directly without register:
You need authorize to allow connect to your social passport for the first time.
WARNING: You are using an old browser that does not support HTML5.
Please choose a modern browser ( /
/ ) to get a good experience.Java解析JSON数据,求个例子 - ITeye问答
这是我前台传回后台的JSON数组,如何解析它,把它放到我指定的实体类里,然后添加到数据库中,网上说用JSONObject,没太看懂,能否给个例子看看
{\"Rel_ProName\":\"1\",\"Rel_type\":\"1\",\"Rel_model\":\"1\",\"Rel_unitName\":\"\",\"Rel_quantity\":1,\"Rel_price\":1,\"Rel_taxPrice\":1.17,\"Rel_money\":1,\"Rel_taxrate\":\"17\",\"Rel_taxSumprice\":0.17}
同楼上说,需要引入jar包
net.sf.json-lib
net.sf.ezmorph
JSONObject 类似Map是因为JSONObject 实现了Map接口,拥有Map的特性
public final class JSONObject extends AbstractJSON implements JSON, Map, Comparable{
JSONObject json =
String jsonStr = request.getParameter("前台传送json字符串的参数名");
// 将json字符串转成json对象
json = JSONObject.fromObject(jsonStr);
} catch (Exception e) {
throw new HuatengException("string转化json对象异常",e);
Iterator iter = json.keySet().iterator();
Map&String,String& map = new HashMap&String,String&();
while (iter.hasNext()) {
String key = (String) iter.next();
String value = json.getString(key);
map.put(key, value);
比较推荐jackson。
例子就不用了,操作很简单,结构相当于Map;需要注意的就是取值的时候注意类型
JSONObject json = JSONObject.fromObject(jsonString)
System.out.println(json.getString("Rel_ProName"));
System.out.println(json.getDouble("Rel_taxSumprice"));
需要引用几个包:
net.sf.json-lib
net.sf.ezmorph
你可以用gson来处理,这个网上代码也是比较多的。
已解决问题
未解决问题

我要回帖

更多关于 苹果手机如何快速拨号 的文章

 

随机推荐