Skip to content

Commit 98769ff

Browse files
committed
rename JsonDateHandler to DateHandler, JsonPropertyConvention to PropertyConvention + make them work like everything else
1 parent ab5e747 commit 98769ff

14 files changed

Lines changed: 119 additions & 103 deletions

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
8484

8585
switch (JsConfig.DateHandler)
8686
{
87-
case JsonDateHandler.UnixTime:
87+
case DateHandler.UnixTime:
8888
int unixTime;
8989
if (int.TryParse(dateTimeStr, out unixTime))
9090
return unixTime.FromUnixTime();
9191
break;
92-
case JsonDateHandler.UnixTimeMs:
92+
case DateHandler.UnixTimeMs:
9393
long unixTimeMs;
9494
if (long.TryParse(dateTimeStr, out unixTimeMs))
9595
return unixTimeMs.FromUnixTimeMs();
@@ -407,7 +407,7 @@ public static DateTimeOffset ParseWcfJsonDateOffset(string wcfJsonDate)
407407

408408
// DCJS ignores the offset and considers it local time if any offset exists
409409
// REVIEW: DCJS shoves offset in a separate field 'offsetMinutes', we have the offset in the format, so shouldn't we use it?
410-
if (JsConfig.DateHandler == JsonDateHandler.DCJSCompatible || timeZone == UnspecifiedOffset)
410+
if (JsConfig.DateHandler == DateHandler.DCJSCompatible || timeZone == UnspecifiedOffset)
411411
{
412412
return unixTime.FromUnixTimeMs().ToLocalTime();
413413
}
@@ -451,7 +451,7 @@ public static DateTime ParseWcfJsonDate(string wcfJsonDate)
451451
}
452452

453453
// DCJS ignores the offset and considers it local time if any offset exists
454-
if (JsConfig.DateHandler == JsonDateHandler.DCJSCompatible || timeZone == UnspecifiedOffset)
454+
if (JsConfig.DateHandler == DateHandler.DCJSCompatible || timeZone == UnspecifiedOffset)
455455
{
456456
return unixTime.FromUnixTimeMs().ToLocalTime();
457457
}
@@ -469,13 +469,13 @@ public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)
469469
dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
470470
}
471471

472-
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
472+
if (JsConfig.DateHandler == DateHandler.ISO8601)
473473
{
474474
writer.Write(dateTime.ToString("o", CultureInfo.InvariantCulture));
475475
return;
476476
}
477477

478-
if (JsConfig.DateHandler == JsonDateHandler.RFC1123)
478+
if (JsConfig.DateHandler == DateHandler.RFC1123)
479479
{
480480
writer.Write(dateTime.ToString("R", CultureInfo.InvariantCulture));
481481
return;
@@ -485,7 +485,7 @@ public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)
485485
string offset = null;
486486
if (dateTime.Kind != DateTimeKind.Utc)
487487
{
488-
if (JsConfig.DateHandler == JsonDateHandler.TimestampOffset && dateTime.Kind == DateTimeKind.Unspecified)
488+
if (JsConfig.DateHandler == DateHandler.TimestampOffset && dateTime.Kind == DateTimeKind.Unspecified)
489489
offset = UnspecifiedOffset;
490490
else
491491
offset = LocalTimeZone.GetUtcOffset(dateTime).ToTimeOffsetString();
@@ -494,7 +494,7 @@ public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)
494494
{
495495
// Normally the JsonDateHandler.TimestampOffset doesn't append an offset for Utc dates, but if
496496
// the JsConfig.AppendUtcOffset is set then we will
497-
if (JsConfig.DateHandler == JsonDateHandler.TimestampOffset && JsConfig.AppendUtcOffset.HasValue && JsConfig.AppendUtcOffset.Value)
497+
if (JsConfig.DateHandler == DateHandler.TimestampOffset && JsConfig.AppendUtcOffset.HasValue && JsConfig.AppendUtcOffset.Value)
498498
offset = UtcOffset;
499499
}
500500

@@ -519,7 +519,7 @@ public static string ToWcfJsonDate(DateTime dateTime)
519519

520520
public static void WriteWcfJsonDateTimeOffset(TextWriter writer, DateTimeOffset dateTimeOffset)
521521
{
522-
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
522+
if (JsConfig.DateHandler == DateHandler.ISO8601)
523523
{
524524
writer.Write(dateTimeOffset.ToString("o", CultureInfo.InvariantCulture));
525525
return;

src/ServiceStack.Text/Common/DeserializeType.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public static object ParseQuotedPrimitive(string value)
132132
return DateTimeSerializer.ParseWcfJsonDate(value);
133133
}
134134

135-
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
135+
if (JsConfig.DateHandler == DateHandler.ISO8601)
136136
{
137137
// check that we have UTC ISO8601 date:
138138
// YYYY-MM-DDThh:mm:ssZ
@@ -147,7 +147,7 @@ public static object ParseQuotedPrimitive(string value)
147147
}
148148
}
149149

150-
if (JsConfig.DateHandler == JsonDateHandler.RFC1123)
150+
if (JsConfig.DateHandler == DateHandler.RFC1123)
151151
{
152152
// check that we have RFC1123 date:
153153
// ddd, dd MMM yyyy HH:mm:ss GMT

src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ private static string TransformFromLowercaseUnderscore(string propertyName)
4545

4646
internal static class DeserializeTypeRefJson
4747
{
48-
public static readonly IPropertyNameResolver DefaultPropertyNameResolver = new DefaultPropertyNameResolver();
49-
public static readonly IPropertyNameResolver LenientPropertyNameResolver = new LenientPropertyNameResolver();
50-
public static IPropertyNameResolver PropertyNameResolver = DefaultPropertyNameResolver;
51-
5248
private static readonly JsonTypeSerializer Serializer = (JsonTypeSerializer)JsonTypeSerializer.Instance;
5349

5450
internal static object StringToType(
@@ -71,6 +67,10 @@ internal static object StringToType(
7167

7268
object instance = null;
7369

70+
var propertyResolver = JsConfig.PropertyConvention == PropertyConvention.Lenient
71+
? ParseUtils.LenientPropertyNameResolver
72+
: ParseUtils.DefaultPropertyNameResolver;
73+
7474
var strTypeLength = strType.Length;
7575
while (index < strTypeLength)
7676
{
@@ -127,7 +127,7 @@ internal static object StringToType(
127127

128128
if (instance == null) instance = ctorFn();
129129

130-
var typeAccessor = PropertyNameResolver.GetTypeAccessorForProperty(propertyName, typeAccessorMap);
130+
var typeAccessor = propertyResolver.GetTypeAccessorForProperty(propertyName, typeAccessorMap);
131131

132132
var propType = possibleTypeInfo && propertyValueStr[0] == '_' ? TypeAccessor.ExtractType(Serializer, propertyValueStr) : null;
133133
if (propType != null)

src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ internal static object StringToType(
3030

3131
object instance = null;
3232

33+
var propertyResolver = JsConfig.PropertyConvention == PropertyConvention.Lenient
34+
? ParseUtils.LenientPropertyNameResolver
35+
: ParseUtils.DefaultPropertyNameResolver;
36+
3337
var strTypeLength = strType.Length;
3438
while (index < strTypeLength)
3539
{
@@ -85,8 +89,7 @@ internal static object StringToType(
8589

8690
if (instance == null) instance = ctorFn();
8791

88-
TypeAccessor typeAccessor;
89-
typeAccessorMap.TryGetValue(propertyName, out typeAccessor);
92+
var typeAccessor = propertyResolver.GetTypeAccessorForProperty(propertyName, typeAccessorMap);
9093

9194
var propType = possibleTypeInfo && propertyValueStr[0] == '_' ? TypeAccessor.ExtractType(Serializer, propertyValueStr) : null;
9295
if (propType != null)

src/ServiceStack.Text/Common/ParseUtils.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ namespace ServiceStack.Text.Common
1616
{
1717
internal static class ParseUtils
1818
{
19+
public static readonly IPropertyNameResolver DefaultPropertyNameResolver = new DefaultPropertyNameResolver();
20+
public static readonly IPropertyNameResolver LenientPropertyNameResolver = new LenientPropertyNameResolver();
21+
1922
public static object NullValueType(Type type)
2023
{
2124
#if NETFX_CORE

src/ServiceStack.Text/JsConfig.cs

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ public static JsConfigScope With(
3737
bool? includeTypeInfo = null,
3838
bool? emitCamelCaseNames = null,
3939
bool? emitLowercaseUnderscoreNames = null,
40-
JsonDateHandler? dateHandler = null,
41-
JsonTimeSpanHandler? timeSpanHandler = null,
40+
DateHandler? dateHandler = null,
41+
TimeSpanHandler? timeSpanHandler = null,
42+
PropertyConvention? propertyConvention = null,
4243
bool? preferInterfaces = null,
4344
bool? throwOnDeserializationError = null,
4445
string typeAttr = null,
@@ -65,6 +66,7 @@ public static JsConfigScope With(
6566
EmitLowercaseUnderscoreNames = emitLowercaseUnderscoreNames ?? sEmitLowercaseUnderscoreNames,
6667
DateHandler = dateHandler ?? sDateHandler,
6768
TimeSpanHandler = timeSpanHandler ?? sTimeSpanHandler,
69+
PropertyConvention = propertyConvention ?? sPropertyConvention,
6870
PreferInterfaces = preferInterfaces ?? sPreferInterfaces,
6971
ThrowOnDeserializationError = throwOnDeserializationError ?? sThrowOnDeserializationError,
7072
TypeAttr = typeAttr ?? sTypeAttr,
@@ -266,14 +268,14 @@ public static Func<string, Type> TypeFinder
266268
}
267269
}
268270

269-
private static JsonDateHandler? sDateHandler;
270-
public static JsonDateHandler DateHandler
271+
private static DateHandler? sDateHandler;
272+
public static DateHandler DateHandler
271273
{
272274
get
273275
{
274276
return (JsConfigScope.Current != null ? JsConfigScope.Current.DateHandler: null)
275277
?? sDateHandler
276-
?? JsonDateHandler.TimestampOffset;
278+
?? DateHandler.TimestampOffset;
277279
}
278280
set
279281
{
@@ -284,14 +286,14 @@ public static JsonDateHandler DateHandler
284286
/// <summary>
285287
/// Sets which format to use when serializing TimeSpans
286288
/// </summary>
287-
private static JsonTimeSpanHandler? sTimeSpanHandler;
288-
public static JsonTimeSpanHandler TimeSpanHandler
289+
private static TimeSpanHandler? sTimeSpanHandler;
290+
public static TimeSpanHandler TimeSpanHandler
289291
{
290292
get
291293
{
292294
return (JsConfigScope.Current != null ? JsConfigScope.Current.TimeSpanHandler : null)
293295
?? sTimeSpanHandler
294-
?? JsonTimeSpanHandler.DurationFormat;
296+
?? TimeSpanHandler.DurationFormat;
295297
}
296298
set
297299
{
@@ -345,22 +347,18 @@ public static bool EmitLowercaseUnderscoreNames
345347
/// <summary>
346348
/// Define how property names are mapped during deserialization
347349
/// </summary>
348-
private static JsonPropertyConvention propertyConvention;
349-
public static JsonPropertyConvention PropertyConvention
350+
private static PropertyConvention? sPropertyConvention;
351+
public static PropertyConvention PropertyConvention
350352
{
351-
get { return propertyConvention; }
353+
get
354+
{
355+
return (JsConfigScope.Current != null ? JsConfigScope.Current.PropertyConvention : null)
356+
?? sPropertyConvention
357+
?? PropertyConvention.Strict;
358+
}
352359
set
353360
{
354-
propertyConvention = value;
355-
switch (propertyConvention)
356-
{
357-
case JsonPropertyConvention.ExactMatch:
358-
DeserializeTypeRefJson.PropertyNameResolver = DeserializeTypeRefJson.DefaultPropertyNameResolver;
359-
break;
360-
case JsonPropertyConvention.Lenient:
361-
DeserializeTypeRefJson.PropertyNameResolver = DeserializeTypeRefJson.LenientPropertyNameResolver;
362-
break;
363-
}
361+
if (!sPropertyConvention.HasValue) sPropertyConvention = value;
364362
}
365363
}
366364

@@ -611,7 +609,7 @@ public static void Reset()
611609
sIncludePublicFields = null;
612610
HasSerializeFn = new HashSet<Type>();
613611
TreatValueAsRefTypes = new HashSet<Type> { typeof(KeyValuePair<,>) };
614-
PropertyConvention = JsonPropertyConvention.ExactMatch;
612+
sPropertyConvention = null;
615613
sExcludePropertyReferences = null;
616614
sExcludeTypes = new HashSet<Type> { typeof(Stream) };
617615
__uniqueTypes = new HashSet<Type>();
@@ -1030,19 +1028,19 @@ public static void Reset()
10301028
}
10311029
}
10321030

1033-
public enum JsonPropertyConvention
1031+
public enum PropertyConvention
10341032
{
10351033
/// <summary>
10361034
/// The property names on target types must match property names in the JSON source
10371035
/// </summary>
1038-
ExactMatch,
1036+
Strict,
10391037
/// <summary>
10401038
/// The property names on target types may not match the property names in the JSON source
10411039
/// </summary>
10421040
Lenient
10431041
}
10441042

1045-
public enum JsonDateHandler
1043+
public enum DateHandler
10461044
{
10471045
TimestampOffset,
10481046
DCJSCompatible,
@@ -1052,7 +1050,7 @@ public enum JsonDateHandler
10521050
UnixTimeMs,
10531051
}
10541052

1055-
public enum JsonTimeSpanHandler
1053+
public enum TimeSpanHandler
10561054
{
10571055
/// <summary>
10581056
/// Uses the xsd format like PT15H10M20S

src/ServiceStack.Text/JsConfigScope.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ public void Dispose()
7070
internal string JsvTypeAttrInObject { get; set; }
7171
public Func<Type, string> TypeWriter { get; set; }
7272
public Func<string, Type> TypeFinder { get; set; }
73-
public JsonDateHandler? DateHandler { get; set; }
74-
public JsonTimeSpanHandler? TimeSpanHandler { get; set; }
73+
public DateHandler? DateHandler { get; set; }
74+
public TimeSpanHandler? TimeSpanHandler { get; set; }
75+
public PropertyConvention? PropertyConvention { get; set; }
7576
public bool? EmitCamelCaseNames { get; set; }
7677
public bool? EmitLowercaseUnderscoreNames { get; set; }
7778
public bool? ThrowOnDeserializationError { get; set; }

src/ServiceStack.Text/Json/JsonTypeSerializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,10 @@ public void WriteDateTime(TextWriter writer, object oDateTime)
115115
var dateTime = (DateTime)oDateTime;
116116
switch (JsConfig.DateHandler)
117117
{
118-
case JsonDateHandler.UnixTime:
118+
case DateHandler.UnixTime:
119119
writer.Write(dateTime.ToUnixTime());
120120
return;
121-
case JsonDateHandler.UnixTimeMs:
121+
case DateHandler.UnixTimeMs:
122122
writer.Write(dateTime.ToUnixTimeMs());
123123
return;
124124
}
@@ -153,7 +153,7 @@ public void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset
153153

154154
public void WriteTimeSpan(TextWriter writer, object oTimeSpan)
155155
{
156-
var stringValue = JsConfig.TimeSpanHandler == JsonTimeSpanHandler.StandardFormat
156+
var stringValue = JsConfig.TimeSpanHandler == TimeSpanHandler.StandardFormat
157157
? oTimeSpan.ToString()
158158
: DateTimeSerializer.ToXsdTimeSpanString((TimeSpan)oTimeSpan);
159159
WriteRawString(writer, stringValue);

src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,24 @@ public void WriteFormattableObjectString(TextWriter writer, object value)
9595

9696
public void WriteDateTime(TextWriter writer, object oDateTime)
9797
{
98+
var dateTime = (DateTime)oDateTime;
99+
switch (JsConfig.DateHandler)
100+
{
101+
case DateHandler.UnixTime:
102+
writer.Write(dateTime.ToUnixTime());
103+
return;
104+
case DateHandler.UnixTimeMs:
105+
writer.Write(dateTime.ToUnixTimeMs());
106+
return;
107+
}
108+
98109
writer.Write(DateTimeSerializer.ToShortestXsdDateTimeString((DateTime)oDateTime));
99110
}
100111

101112
public void WriteNullableDateTime(TextWriter writer, object dateTime)
102113
{
103114
if (dateTime == null) return;
104-
writer.Write(DateTimeSerializer.ToShortestXsdDateTimeString((DateTime)dateTime));
115+
WriteDateTime(writer, dateTime);
105116
}
106117

107118
public void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset)

tests/ServiceStack.Text.Tests/DateTimeOffsetAndTimeSpanTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void Can_serialize_TimeSpan_field()
6262
[Test]
6363
public void Can_serialize_TimeSpan_field_with_StandardTimeSpanFormat()
6464
{
65-
using (JsConfig.With(timeSpanHandler:JsonTimeSpanHandler.StandardFormat))
65+
using (JsConfig.With(timeSpanHandler:TimeSpanHandler.StandardFormat))
6666
{
6767
var period = TimeSpan.FromSeconds(70);
6868

@@ -75,7 +75,7 @@ public void Can_serialize_TimeSpan_field_with_StandardTimeSpanFormat()
7575
[Test]
7676
public void Can_serialize_NullableTimeSpan_field_with_StandardTimeSpanFormat()
7777
{
78-
using (JsConfig.With(timeSpanHandler: JsonTimeSpanHandler.StandardFormat))
78+
using (JsConfig.With(timeSpanHandler: TimeSpanHandler.StandardFormat))
7979
{
8080
var period = TimeSpan.FromSeconds(70);
8181

@@ -88,7 +88,7 @@ public void Can_serialize_NullableTimeSpan_field_with_StandardTimeSpanFormat()
8888
[Test]
8989
public void Can_serialize_NullTimeSpan_field_with_StandardTimeSpanFormat()
9090
{
91-
using (JsConfig.With(timeSpanHandler: JsonTimeSpanHandler.StandardFormat))
91+
using (JsConfig.With(timeSpanHandler: TimeSpanHandler.StandardFormat))
9292
{
9393
var model = new NullableSampleModel { Id = 1 };
9494
var json = JsonSerializer.SerializeToString(model);

0 commit comments

Comments
 (0)