Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit e5d756e

Browse files
committed
Remove RegEx in favour of simple logic to determine valid JSON Numbers
1 parent af7e807 commit e5d756e

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

src/ServiceStack.Text/JsonObject.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,6 @@ public string Child(string key)
116116
{
117117
return base[key];
118118
}
119-
120-
static readonly Regex NumberRegEx = new Regex(@"^(0|[1-9]*)(?:\.[0-9]*)?$", PclExport.Instance.RegexOptions);
121119

122120
/// <summary>
123121
/// Write JSON Array, Object, bool or number values as raw string
@@ -133,7 +131,7 @@ public static void WriteValue(TextWriter writer, object value)
133131
|| (firstChar == JsWriter.ListStartChar && lastChar == JsWriter.ListEndChar)
134132
|| JsonUtils.True == strValue
135133
|| JsonUtils.False == strValue
136-
|| (NumberRegEx.IsMatch(strValue) && IsJavaScriptNumber(strValue)))
134+
|| IsJavaScriptNumber(strValue))
137135
{
138136
writer.Write(strValue);
139137
return;
@@ -144,6 +142,15 @@ public static void WriteValue(TextWriter writer, object value)
144142

145143
private static bool IsJavaScriptNumber(string strValue)
146144
{
145+
var firstChar = strValue[0];
146+
if (firstChar == '0')
147+
{
148+
if (strValue.Length == 1)
149+
return true;
150+
if (!strValue.Contains("."))
151+
return false;
152+
}
153+
147154
if (!strValue.Contains("."))
148155
{
149156
long longValue;

tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,28 @@ public void Can_parse_empty_object_with_mixed_whitespaces()
3030
public void Can_Serialize_numbers()
3131
{
3232
string notNumber = "{\"field\":\"00001\"}";
33-
Assert.AreEqual(notNumber, JsonObject.Parse(notNumber).ToJson<JsonObject>());
33+
Assert.That(JsonObject.Parse(notNumber).ToJson(), Is.EqualTo(notNumber));
3434

3535
string num1 = "{\"field\":0}";
36-
Assert.AreEqual(num1, JsonObject.Parse(num1).ToJson<JsonObject>());
36+
Assert.That(JsonObject.Parse(num1).ToJson(), Is.EqualTo(num1));
3737

3838
string num2 = "{\"field\":0.5}";
39-
Assert.AreEqual(num2, JsonObject.Parse(num2).ToJson<JsonObject>());
39+
Assert.That(JsonObject.Parse(num2).ToJson(), Is.EqualTo(num2));
4040

4141
string num3 = "{\"field\":.5}";
42-
Assert.AreEqual(num3, JsonObject.Parse(num3).ToJson<JsonObject>());
42+
Assert.That(JsonObject.Parse(num3).ToJson(), Is.EqualTo(num3));
4343

4444
string num4 = "{\"field\":12312}";
45-
Assert.AreEqual(num4, JsonObject.Parse(num4).ToJson<JsonObject>());
45+
Assert.That(JsonObject.Parse(num4).ToJson(), Is.EqualTo(num4));
4646

4747
string num5 = "{\"field\":12312.1231}";
48-
Assert.AreEqual(num5, JsonObject.Parse(num5).ToJson<JsonObject>());
48+
Assert.That(JsonObject.Parse(num5).ToJson(), Is.EqualTo(num5));
49+
50+
string num6 = "{\"field\":1435252569117}";
51+
Assert.That(JsonObject.Parse(num6).ToJson(), Is.EqualTo(num6));
52+
53+
string num7 = "{\"field\":1435052569117}";
54+
Assert.That(JsonObject.Parse(num7).ToJson(), Is.EqualTo(num7));
4955
}
5056

5157
public class Jackalope
@@ -279,6 +285,7 @@ public void Can_Deserialize_JsonValue_After_Multiple_Serialize_2()
279285
Assert.That(fromJson.value1, Is.EqualTo(simple.value1));
280286
Assert.That(fromJson.value2, Is.EqualTo(simple.value2));
281287
}
288+
282289
[Test]
283290
public void Can_Serialize_NestedJsonValueDto()
284291
{

0 commit comments

Comments
 (0)