Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
畅游知识海洋
json
提交
0cd2ecf4
J
json
项目概览
畅游知识海洋
/
json
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
json
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0cd2ecf4
编写于
1月 09, 2015
作者:
N
Niels
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
minor style adjustments
上级
3fa2e900
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
121 addition
and
35 deletion
+121
-35
header_only/json.h
header_only/json.h
+65
-9
src/json.cc
src/json.cc
+56
-26
未找到文件。
header_only/json.h
浏览文件 @
0cd2ecf4
...
...
@@ -2482,35 +2482,91 @@ Parses a string after opening quotes (\p ") where read.
@post The character after the closing quote \p " is the current character @ref
current_. Whitespace is skipped.
@todo Unicode escapes such as \uxxxx are missing - see
https://github.com/nlohmann/json/issues/12
*/
std
::
string
json
::
parser
::
parseString
()
{
// remember the position where the first character of the string was
const
auto
startPos
=
pos_
;
// true if and only if the amount of backslashes before the current
// character is even
bool
evenAmountOfBackslashes
=
true
;
// the result of the parse process
std
::
string
result
;
// iterate with pos_ over the whole string
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
char
currentChar
=
buffer_
[
pos_
];
//
currentChar is a quote, so we might have found the end of the str
ing
if
(
currentChar
==
'"'
)
//
uneven amount of backslashes means the user wants to escape someth
ing
if
(
!
evenAmountOfBackslashes
)
{
// but only if the amount of backslashes before that quote is even
if
(
evenAmountOfBackslashes
)
// slash, backslash and quote are copied as is
if
(
currentChar
==
'/'
or
currentChar
==
'\\'
or
currentChar
==
'"'
)
{
result
+=
currentChar
;
}
else
{
// all other characters are replaced by their respective
// special character
switch
(
currentChar
)
{
case
't'
:
{
result
+=
'\t'
;
break
;
}
case
'b'
:
{
result
+=
'\b'
;
break
;
}
case
'f'
:
{
result
+=
'\f'
;
break
;
}
case
'n'
:
{
result
+=
'\n'
;
break
;
}
case
'r'
:
{
result
+=
'\r'
;
break
;
}
default:
{
error
(
"expected one of
\\
, /, b, f, n, r, t behind backslash."
);
}
}
// TODO implement \uXXXX
}
}
else
{
if
(
currentChar
==
'"'
)
{
// currentChar is a quote, so we found the end of the string
const
auto
stringLength
=
pos_
-
startPos
;
// set pos_ behind the trailing quote
pos_
++
;
// find next char to parse
next
();
// return string inside the quotes
return
buffer_
.
substr
(
startPos
,
stringLength
);
// bring the result of the parsing process back to the caller
return
result
;
}
else
if
(
currentChar
!=
'\\'
)
{
// All non-backslash characters are added to the end of the
// result string. The only backslashes we want in the result
// are the ones that are escaped (which happens above).
result
+=
currentChar
;
}
}
...
...
src/json.cc
浏览文件 @
0cd2ecf4
...
...
@@ -2039,6 +2039,9 @@ Parses a string after opening quotes (\p ") where read.
@post The character after the closing quote \p " is the current character @ref
current_. Whitespace is skipped.
@todo Unicode escapes such as \uxxxx are missing - see
https://github.com/nlohmann/json/issues/12
*/
std
::
string
json
::
parser
::
parseString
()
{
...
...
@@ -2050,39 +2053,63 @@ std::string json::parser::parseString()
std
::
string
result
;
// iterate with pos_ over the whole string
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
char
currentChar
=
buffer_
[
pos_
];
// uneven amount of backslashes means the user wants to escape something
if
(
!
evenAmountOfBackslashes
)
{
if
(
!
evenAmountOfBackslashes
)
{
// slash, backslash and quote are copied as is
if
(
currentChar
==
'/'
||
currentChar
==
'\\'
||
currentChar
==
'"'
)
{
if
(
currentChar
==
'/'
or
currentChar
==
'\\'
or
currentChar
==
'"'
)
{
result
+=
currentChar
;
}
else
{
// All other characters are replaced by their respective special character
if
(
currentChar
==
't'
)
{
result
+=
'\t'
;
}
else
if
(
currentChar
==
'b'
)
{
result
+=
'\b'
;
}
else
if
(
currentChar
==
'f'
)
{
result
+=
'\f'
;
}
else
if
(
currentChar
==
'n'
)
{
result
+=
'\n'
;
}
else
if
(
currentChar
==
'r'
)
{
result
+=
'\r'
;
}
else
{
error
(
"expected one of
\\
,/,b,f,n,r,t behind backslash."
);
}
else
{
// all other characters are replaced by their respective
// special character
switch
(
currentChar
)
{
case
't'
:
{
result
+=
'\t'
;
break
;
}
case
'b'
:
{
result
+=
'\b'
;
break
;
}
case
'f'
:
{
result
+=
'\f'
;
break
;
}
case
'n'
:
{
result
+=
'\n'
;
break
;
}
case
'r'
:
{
result
+=
'\r'
;
break
;
}
default:
{
error
(
"expected one of
\\
, /, b, f, n, r, t behind backslash."
);
}
}
// TODO implement \uXXXX
}
}
else
{
if
(
currentChar
==
'"'
)
{
}
else
{
if
(
currentChar
==
'"'
)
{
// currentChar is a quote, so we found the end of the string
// set pos_ behind the trailing quote
pos_
++
;
// find next char to parse
...
...
@@ -2090,9 +2117,12 @@ std::string json::parser::parseString()
// bring the result of the parsing process back to the caller
return
result
;
}
else
if
(
currentChar
!=
'\\'
)
{
// all non-backslash characters are added to the end of the result string.
// the only backslashes we want in the result are the ones that are escaped (which happens above).
}
else
if
(
currentChar
!=
'\\'
)
{
// All non-backslash characters are added to the end of the
// result string. The only backslashes we want in the result
// are the ones that are escaped (which happens above).
result
+=
currentChar
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录