Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
def803f1
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
def803f1
编写于
3月 15, 2016
作者:
N
Nick Guerrera
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove dependency on JsonDataContractSerializer
上级
4be251ed
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
108 addition
and
11 deletion
+108
-11
src/Compilers/Core/Portable/InternalUtilities/JsonWriter.cs
src/Compilers/Core/Portable/InternalUtilities/JsonWriter.cs
+108
-11
未找到文件。
src/Compilers/Core/Portable/InternalUtilities/JsonWriter.cs
浏览文件 @
def803f1
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using
System
;
using
System.Globalization
;
using
System.IO
;
using
System.
Runtime.Serialization.Json
;
using
System.
Text
;
namespace
Roslyn.Utilities
{
...
...
@@ -19,7 +20,6 @@ namespace Roslyn.Utilities
internal
sealed
class
JsonWriter
:
IDisposable
{
private
readonly
StreamWriter
_outptut
;
private
readonly
DataContractJsonSerializer
_stringWriter
;
private
int
_indent
;
private
string
_pending
;
...
...
@@ -31,7 +31,6 @@ internal sealed class JsonWriter : IDisposable
public
JsonWriter
(
StreamWriter
output
)
{
_outptut
=
output
;
_stringWriter
=
new
DataContractJsonSerializer
(
typeof
(
string
));
_pending
=
""
;
}
...
...
@@ -94,15 +93,10 @@ public void Write(string key, bool value)
public
void
Write
(
string
value
)
{
// Consider switching to custom escaping logic here. Flushing all the time (in
// order to borrow DataContractJsonSerializer escaping) is expensive.
//
// Also, it would be nicer not to escape the forward slashes in URIs (which is
// optional in JSON.)
WritePending
();
_outptut
.
Flush
();
_stringWriter
.
WriteObject
(
_outptut
.
BaseStream
,
value
);
_outptut
.
Write
(
'"'
);
_outptut
.
Write
(
EscapeString
(
value
));
_outptut
.
Write
(
'"'
);
_pending
=
s_commaNewLine
;
}
...
...
@@ -154,5 +148,108 @@ public void Dispose()
{
_outptut
.
Dispose
();
}
// String escaping implementation forked from System.Runtime.Serialization.Json to
// avoid a large dependency graph for this small amount of code:
//
// https://github.com/dotnet/corefx/blob/master/src/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JavaScriptString.cs
//
// Possible future improvements: https://github.com/dotnet/roslyn/issues/9769
//
// - Avoid intermediate StringBuilder and send escaped output directly to the destination.
//
// - Stop escaping '/': it is is optional per JSON spec and several users have expressed
// that they don't like the way '\/' looks.
//
private
static
string
EscapeString
(
string
value
)
{
StringBuilder
b
=
null
;
if
(
string
.
IsNullOrEmpty
(
value
))
{
return
string
.
Empty
;
}
int
startIndex
=
0
;
int
count
=
0
;
for
(
int
i
=
0
;
i
<
value
.
Length
;
i
++)
{
char
c
=
value
[
i
];
if
(
c
==
'\"'
||
c
==
'\''
||
c
==
'/'
||
c
==
'\\'
||
ShouldAppendAsUnicode
(
c
))
{
if
(
b
==
null
)
{
b
=
new
StringBuilder
(
value
.
Length
+
5
);
}
if
(
count
>
0
)
{
b
.
Append
(
value
,
startIndex
,
count
);
}
startIndex
=
i
+
1
;
count
=
0
;
}
switch
(
c
)
{
case
'\"'
:
b
.
Append
(
"\\\""
);
break
;
case
'\\'
:
b
.
Append
(
"\\\\"
);
break
;
case
'/'
:
b
.
Append
(
"\\/"
);
break
;
case
'\''
:
b
.
Append
(
"\'"
);
break
;
default
:
if
(
ShouldAppendAsUnicode
(
c
))
{
AppendCharAsUnicode
(
b
,
c
);
}
else
{
count
++;
}
break
;
}
}
if
(
b
==
null
)
{
return
value
;
}
if
(
count
>
0
)
{
b
.
Append
(
value
,
startIndex
,
count
);
}
return
b
.
ToString
();
}
private
static
void
AppendCharAsUnicode
(
StringBuilder
builder
,
char
c
)
{
builder
.
Append
(
"\\u"
);
builder
.
AppendFormat
(
CultureInfo
.
InvariantCulture
,
"{0:x4}"
,
(
int
)
c
);
}
private
static
bool
ShouldAppendAsUnicode
(
char
c
)
{
// Note on newline characters: Newline characters in JSON strings need to be encoded on the way out
// See Unicode 6.2, Table 5-1 (http://www.unicode.org/versions/Unicode6.2.0/ch05.pdf]) for the full list.
// We only care about NEL, LS, and PS, since the other newline characters are all
// control characters so are already encoded.
return
c
<
' '
||
c
>=
(
char
)
0xfffe
||
// max char
(
c
>=
(
char
)
0xd800
&&
c
<=
(
char
)
0xdfff
)
||
// between high and low surrogate
(
c
==
'\
u0085
'
||
c
==
'\
u2028
'
||
c
==
'\
u2029
'
);
// Unicode new line characters
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录