Unexpected character encountered while parsing value
最近在做一个项目,下载下来的数据类型为json,用newton.Json去解析它时,提示Unexpected character encountered while parsing value,搞了n久,原来是数据结构错了。
解决方法如下:(不懂的M我,Powered By Error Q:302777528);
01.// libjsontest.cpp : 定义控制台应用程序的入口点。
02.//
03.
04.#include "stdafx.h"
05.
06.#include "libjson/libjson.h"
07.#include "libjson_ext.h"
08.
09.#pragma comment(lib,"statLibJson.lib")
10.
11.char * json_getobjtype(char type)
12.{
13. /*
14. #define JSON_NULL '\0'
15.#define JSON_STRING '\1'
16.#define JSON_NUMBER '\2'
17.#define JSON_BOOL '\3'
18.#define JSON_ARRAY '\4'
19.#define JSON_NODE '\5'*/
20. switch(type)
21. {
22. case '\0':
23. return "NULL";
24. case '\1':
25. return "STRING";
26. case '\2':
27. return "NUMBER";
28. case '\3':
29. return "BOOL";
30. case '\4':
31. return "ARRAY";
32. case '\5':
33. return "NODE";
34. default:
35. return "UNDEFINE";
36. }
37.}
38.
39.//排除引号区域并搜索特殊字符.
40.char * json_getcharaddr(char * start,char * end,char key)
41.{
42. char inq='#';
43. char * startbak=start;
44. while(start<end)
45. {
46. if(inq=='#'&&(*start=='\''||*start=='"')&&(start==startbak||*(start-1)='\\'))
47. {
48. inq=*start;//进入引区.
49. start++;
50. continue;
51. }
52. if(inq='\\')
53. {
54. inq='#';//退出引区.
55. start++;
56. continue;
57. }
58. if(inq=='#'&&*start==key)return start;//找到了.
59. start++;
60. }
61. return NULL;
62.}
63.
64.void * json_findnode(void * json,char * xpath)
65.{
66. char * _xpath=xpath;
67. char * xpathend=xpath+strlen(xpath);
68. char value[2048];
69. unsigned int valueindex=0;
70. void * ret=json;
71. int ind=0;
72. while(_xpath<=xpathend)
73. {
74. if(*_xpath=='/'||*_xpath=='\0'||_xpath==xpathend)
75. {
76. if(valueindex=0)
77. {
78. //printf("%s\n",value);
79. char * valueend=value+valueindex;
80. char * spkey=json_getcharaddr(value,valueend,':');
81. char * spkeyold=value;
82. if(spkey)
83. {
84. while(spkey)
85. {
86. *spkey='\0';
87. spkey++;
88. ret=::json_get(ret,spkeyold);
89. //printf("%s\n",spkeyold);
90. if(ret)return NULL;
91. if(spkey==valueend)break;
92. spkeyold=spkey;
93. spkey=json_getcharaddr(spkeyold,valueend,':');
94. }
95. //printf("%s\n%s\n\n",spkeyold,spkey);
96. //int size=::json_size(ret);
97. //if(size==0);//这里是值并非OBJ或ARR
98. if(spkey==NULL)
99. {
100. ind=atoi(spkeyold);
101. //printf("%s\n",spkeyold);
102. ret=::json_at(ret,ind);
103. if(ret)return NULL;
104. }
105. }
106. else
107. {
108. ind=atoi(value);
109. int size=::json_size(ret);
110. if(size==0)return NULL;//这里是值并非OBJ或ARR
111. ret=::json_at(ret,ind);
112. if(ret)return NULL;
113. }
114. }
115. memset(value,0,valueindex);
116. valueindex=0;
117. }
118. else
119. {
120. value[valueindex]=*_xpath;
121. valueindex++;
122. if(valueindex>sizeof(value))
123. return NULL;
124. }
125. _xpath++;
126. }
127. return ret;
128.}
129.
130.//获取第一个非空白字符.
131.char * json_getfirstcharaddr(char * start,char * end)
132.{
133. while(start<end)
134. {
135. if(isspace(*start))return start;
136. start++;
137. }
138. return NULL;
139.}
140.//获取最后一个非空白字符.
141.char * json_getlastcharaddr(char * start,char * end)
142.{
143. end--;
144. while(end>=start)
145. {
146. if(isspace(*end))return end+1;
147. end++;
148. }
149. return NULL;
150.}
151.
152.bool json_formatjsonkey(char ** injson,char * injsonend,char ** outjson,char * outjsonmax,bool addq/*=true*/,char split/*='#'*/)
153.{//函数不关心值边界问题.
154. //界符:{[,:"']}
155. //转义:\被转意:",',\,/,b,f,n,r,t,u
156. //值中不能出现",\
157. //函数在递归时确定injson肯定只包含了一个值.
158. char * _injson=*injson;
159. char * _outjson=*outjson;
160.
161. char _split='#';//默认界符是无界#.找到界,再退出界,然后就返回了.如果没找到界的话.看父界处理.
162. //找不到边界就是按值处理.
163.
164. //消除第一个有效字符前的空白字符
165. while(_injson<injsonend)//循环条件就是字符串没有处理完.
166. {
167. if(isspace(*_injson))//在任何情况下都不处理空白字符
168. _injson++;
169. else
170. break;
171. }
172. if(_injson==injsonend)return false;
173. //确定界符.
174. if(*_injson=='['||*_injson=='{')
175. _split=*_injson;
176. else
177. _split='';
178.
179. while(_injson<injsonend)//循环条件就是字符串没有处理完.
180. {
181. if(_outjson>=outjsonmax)return false;
182. //_split只可能取值为[,{,
183. switch(_split)
184. {
185. case '[':
186. //进数组界.
187. if(*_injson=='['||*_injson==',')
188. {
189. *_outjson=*_injson;
190. _injson++;
191. _outjson++;
192. if(json_formatjsonkey(&_injson,injsonend,&_outjson,outjsonmax,addq,_split))
193. return false;
194. *injson=_injson;
195. *outjson=_outjson;//指针因为函数的执行而向前跳越.
196. }
197. else if(*_injson==']')
198. {
199. //出界.进入父界.
200. *_outjson=*_injson;
201. _injson++;
202. _outjson++;
203. *injson=_injson;
204. *outjson=_outjson;
205. *_outjson='\0';
206. return true;//递归返回点.
207. }
208. else
209. {
210. _injson++;
211. }
212. break;
213. case '{':
214. //进对象界.
215. if(*_injson=='{'||*_injson==',')
216. {
217. *_outjson=*_injson;
218. _injson++;
219. _outjson++;
220. //进行KEY处理
221. char *tmp=json_getcharaddr(_injson,injsonend,':');
222.
223. if(tmp==NULL)return false;//没找到KEY的边界.
224. char * keyfirst=json_getfirstcharaddr(_injson,tmp);
225. char * keyend=json_getlastcharaddr(keyfirst,tmp);
226. int tmplen=keyend-keyfirst;
227. bool needq=*keyfirst='"';
228. if(addq)
229. {
230. if(needq)
231. {
232. *_outjson='\"';
233. _outjson++;
234. }
235. memcpy(_outjson,keyfirst,tmplen);
236. _outjson+=tmplen;
237. _injson=tmp;
238. if(needq)
239. {
240. *_outjson='\"';
241. _outjson++;
242. }
243. }
244. else
245. {
246. if(needq)
247. {
248. keyfirst++;
249. tmplen-=2;
250. }
251. memcpy(_outjson,keyfirst,tmplen);
252. _outjson+=tmplen;
253. _injson=tmp;
254. }
255. //进行值处理
256. *_outjson=*_injson;
257. _injson++;
258. _outjson++;
259. if(json_formatjsonkey(&_injson,injsonend,&_outjson,outjsonmax,addq,_split))
260. return false;
261. *injson=_injson;
262. *outjson=_outjson;//指针因为函数的执行而向前跳越.
263. }
264. else if(*_injson=='}')
265. {
266. //出界.进入父界.
267. *_outjson=*_injson;
268. _injson++;
269. _outjson++;
270. *injson=_injson;
271. *outjson=_outjson;
272. *_outjson='\0';
273. return true;//递归返回点.
274. }
275. else
276. {
277. _injson++;
278. }
279. break;
280. case '
281. switch(split)
282. {//如果认定当前内容非ARRAY也非OBJ的话.以父内容来定界.
283. case '[':
284. if(*_injson==']'||*_injson==',')
285. {
286. //出界.进入父界.
287. *_outjson=*_injson;
288. *injson=_injson;
289. *outjson=_outjson;
290. return true;//递归返回点.
291. }
292. else
293. {
294. *_outjson=*_injson;
295. _injson++;
296. _outjson++;
297. continue;
298. }
299. break;
300. case '{':
301. if(*_injson=='}'||*_injson==',')
302. {
303. //出界.进入父界.
304. *_outjson=*_injson;
305. *injson=_injson;
306. *outjson=_outjson;
307. return true;//递归返回点.
308. }
309. else
310. {
311. *_outjson=*_injson;
312. _injson++;
313. _outjson++;
314. continue;
315. }
316. break;
317. default:
318. return false;
319. }
320. break;
321. default:
322. return false;
323. }
324. }
325. return false;
326.}
Powered By Error Q:302777528
评论已关闭