Skip to content

Commit 2b9006e

Browse files
committed
pref: Оптимизация экранирования символов в ЗаписьJSON
1 parent 00723cb commit 2b9006e

File tree

1 file changed

+29
-44
lines changed

1 file changed

+29
-44
lines changed

src/OneScript.StandardLibrary/Json/JSONWriter.cs

Lines changed: 29 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -123,96 +123,81 @@ void WriteStringValue(string val)
123123

124124
string EscapeCharacters(string sval, bool EscapeSlash)
125125
{
126-
var sb = new StringBuilder(sval);
126+
var sb = new StringBuilder();
127127

128-
int Length = sval.Length;
129-
for (var i = 0; i < Length; i++)
128+
int length = sval.Length;
129+
int start = 0;
130+
131+
for (var i = 0; i < length; i++)
130132
{
131-
char c = sb[i];
133+
char c = sval[i];
134+
string? escapedValue = null;
135+
132136
if (EscapeSlash && c == '/')
133137
{
134-
sb.Replace("/", "\\/", i, 1);
135-
Length++;
136-
i++;
138+
escapedValue = "\\/";
137139
}
138140
else if (_settings.EscapeAmpersand && c == '&')
139141
{
140-
sb.Replace("&", "\\&", i, 1);
141-
Length++;
142-
i++;
142+
escapedValue = "\\&";
143143
}
144144
else if ((_settings.EscapeSingleQuotes || !_settings.UseDoubleQuotes) && c == '\'')
145145
{
146-
sb.Replace("'", "\\u0027", i, 1);
147-
Length = Length + 5;
148-
i = i + 5;
146+
escapedValue = "\\u0027";
149147
}
150148
else if (_settings.EscapeAngleBrackets && c == '<')
151149
{
152-
sb.Replace("<", "\\u003C", i, 1);
153-
Length = Length + 5;
154-
i = i + 5;
150+
escapedValue = "\\u003C";
155151
}
156152
else if (_settings.EscapeAngleBrackets && c == '>')
157153
{
158-
sb.Replace(">", "\\u003E", i, 1);
159-
Length = Length + 5;
160-
i = i + 5;
154+
escapedValue = "\\u003E";
161155
}
162156
else if (c == '\r')
163157
{
164-
sb.Replace("\r", "\\r", i, 1);
165-
Length++;
166-
i++;
158+
escapedValue = "\\r";
167159
}
168160
else if (c == '\n')
169161
{
170-
sb.Replace("\n", "\\n", i, 1);
171-
Length++;
172-
i++;
162+
escapedValue = "\\n";
173163
}
174164
else if (c == '\f')
175165
{
176-
sb.Replace("\f", "\\f", i, 1);
177-
Length++;
178-
i++;
166+
escapedValue = "\\f";
179167
}
180168
else if (c == '\"')
181169
{
182-
sb.Replace("\"", "\\\"", i, 1);
183-
Length++;
184-
i++;
170+
escapedValue = "\\\"";
185171
}
186172
else if (c == '\b')
187173
{
188-
sb.Replace("\b", "\\b", i, 1);
189-
Length++;
190-
i++;
174+
escapedValue = "\\b";
191175
}
192176
else if (c == '\t')
193177
{
194-
sb.Replace("\t", "\\t", i, 1);
195-
Length++;
196-
i++;
178+
escapedValue = "\\t";
197179
}
198180
else if (c == '\\')
199181
{
200-
sb.Replace("\\", "\\\\", i, 1);
201-
Length++;
202-
i++;
182+
escapedValue = "\\\\";
203183
}
204184

205185
// Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f;
206186
else if ((int)c >= 0 && (int)c <= 31)
207187
{
208-
string unicode = "\\u" + ((int)c).ToString("X4").ToLower();
209-
sb.Replace(c.ToString(), unicode, i, 1);
210-
Length = Length + 5;
211-
i = i + 5;
188+
escapedValue = "\\u" + ((int)c).ToString("x4");
212189
}
213190

191+
if (escapedValue != null)
192+
{
193+
sb.Append(sval, start, i - start);
194+
sb.Append(escapedValue);
195+
start = i + 1;
196+
}
214197
}
198+
215199
sb.Insert(0, _writer.QuoteChar);
200+
sb.Append(sval, start, length - start);
216201
sb.Append(_writer.QuoteChar);
217202
return sb.ToString();
218203
}

0 commit comments

Comments
 (0)