Skip to content

Commit 7e6186e

Browse files
committed
Merge branch 'develop'
* develop: Changed to use invariant number parsing Added support for lowercaseing outputted property names Made compatible with SqlClr
2 parents c2243f7 + 74684fa commit 7e6186e

4 files changed

Lines changed: 144 additions & 131 deletions

File tree

src/LitJson/JsonMapper.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,33 +100,33 @@ public IDictionary<string, PropertyMetadata> Properties {
100100
public class JsonMapper
101101
{
102102
#region Fields
103-
private static int max_nesting_depth;
103+
private static readonly int max_nesting_depth;
104104

105-
private static IFormatProvider datetime_format;
105+
private static readonly IFormatProvider datetime_format;
106106

107-
private static IDictionary<Type, ExporterFunc> base_exporters_table;
108-
private static IDictionary<Type, ExporterFunc> custom_exporters_table;
107+
private static readonly IDictionary<Type, ExporterFunc> base_exporters_table;
108+
private static readonly IDictionary<Type, ExporterFunc> custom_exporters_table;
109109

110-
private static IDictionary<Type,
110+
private static readonly IDictionary<Type,
111111
IDictionary<Type, ImporterFunc>> base_importers_table;
112-
private static IDictionary<Type,
112+
private static readonly IDictionary<Type,
113113
IDictionary<Type, ImporterFunc>> custom_importers_table;
114114

115-
private static IDictionary<Type, ArrayMetadata> array_metadata;
115+
private static readonly IDictionary<Type, ArrayMetadata> array_metadata;
116116
private static readonly object array_metadata_lock = new Object ();
117117

118-
private static IDictionary<Type,
118+
private static readonly IDictionary<Type,
119119
IDictionary<Type, MethodInfo>> conv_ops;
120120
private static readonly object conv_ops_lock = new Object ();
121121

122-
private static IDictionary<Type, ObjectMetadata> object_metadata;
122+
private static readonly IDictionary<Type, ObjectMetadata> object_metadata;
123123
private static readonly object object_metadata_lock = new Object ();
124124

125-
private static IDictionary<Type,
125+
private static readonly IDictionary<Type,
126126
IList<PropertyMetadata>> type_properties;
127127
private static readonly object type_properties_lock = new Object ();
128128

129-
private static JsonWriter static_writer;
129+
private static readonly JsonWriter static_writer;
130130
private static readonly object static_writer_lock = new Object ();
131131
#endregion
132132

src/LitJson/JsonReader.cs

Lines changed: 114 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
using System;
1313
using System.Collections.Generic;
14+
using System.Globalization;
1415
using System.IO;
1516
using System.Text;
1617

@@ -42,7 +43,7 @@ public enum JsonToken
4243
public class JsonReader
4344
{
4445
#region Fields
45-
private static IDictionary<int, IDictionary<int, int[]>> parse_table;
46+
private static readonly IDictionary<int, IDictionary<int, int[]>> parse_table;
4647

4748
private Stack<int> automaton_stack;
4849
private int current_input;
@@ -98,7 +99,7 @@ public object Value {
9899
#region Constructors
99100
static JsonReader ()
100101
{
101-
PopulateParseTable ();
102+
parse_table = PopulateParseTable ();
102103
}
103104

104105
public JsonReader (string json_text) :
@@ -138,120 +139,122 @@ private JsonReader (TextReader reader, bool owned)
138139

139140

140141
#region Static Methods
141-
private static void PopulateParseTable ()
142+
private static IDictionary<int, IDictionary<int, int[]>> PopulateParseTable ()
142143
{
143144
// See section A.2. of the manual for details
144-
parse_table = new Dictionary<int, IDictionary<int, int[]>> ();
145-
146-
TableAddRow (ParserToken.Array);
147-
TableAddCol (ParserToken.Array, '[',
148-
'[',
149-
(int) ParserToken.ArrayPrime);
150-
151-
TableAddRow (ParserToken.ArrayPrime);
152-
TableAddCol (ParserToken.ArrayPrime, '"',
153-
(int) ParserToken.Value,
154-
155-
(int) ParserToken.ValueRest,
156-
']');
157-
TableAddCol (ParserToken.ArrayPrime, '[',
158-
(int) ParserToken.Value,
159-
(int) ParserToken.ValueRest,
160-
']');
161-
TableAddCol (ParserToken.ArrayPrime, ']',
162-
']');
163-
TableAddCol (ParserToken.ArrayPrime, '{',
164-
(int) ParserToken.Value,
165-
(int) ParserToken.ValueRest,
166-
']');
167-
TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.Number,
168-
(int) ParserToken.Value,
169-
(int) ParserToken.ValueRest,
170-
']');
171-
TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.True,
172-
(int) ParserToken.Value,
173-
(int) ParserToken.ValueRest,
174-
']');
175-
TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.False,
176-
(int) ParserToken.Value,
177-
(int) ParserToken.ValueRest,
178-
']');
179-
TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.Null,
180-
(int) ParserToken.Value,
181-
(int) ParserToken.ValueRest,
182-
']');
183-
184-
TableAddRow (ParserToken.Object);
185-
TableAddCol (ParserToken.Object, '{',
186-
'{',
187-
(int) ParserToken.ObjectPrime);
188-
189-
TableAddRow (ParserToken.ObjectPrime);
190-
TableAddCol (ParserToken.ObjectPrime, '"',
191-
(int) ParserToken.Pair,
192-
(int) ParserToken.PairRest,
193-
'}');
194-
TableAddCol (ParserToken.ObjectPrime, '}',
195-
'}');
196-
197-
TableAddRow (ParserToken.Pair);
198-
TableAddCol (ParserToken.Pair, '"',
199-
(int) ParserToken.String,
200-
':',
201-
(int) ParserToken.Value);
202-
203-
TableAddRow (ParserToken.PairRest);
204-
TableAddCol (ParserToken.PairRest, ',',
205-
',',
206-
(int) ParserToken.Pair,
207-
(int) ParserToken.PairRest);
208-
TableAddCol (ParserToken.PairRest, '}',
209-
(int) ParserToken.Epsilon);
210-
211-
TableAddRow (ParserToken.String);
212-
TableAddCol (ParserToken.String, '"',
213-
'"',
214-
(int) ParserToken.CharSeq,
215-
'"');
216-
217-
TableAddRow (ParserToken.Text);
218-
TableAddCol (ParserToken.Text, '[',
219-
(int) ParserToken.Array);
220-
TableAddCol (ParserToken.Text, '{',
221-
(int) ParserToken.Object);
222-
223-
TableAddRow (ParserToken.Value);
224-
TableAddCol (ParserToken.Value, '"',
225-
(int) ParserToken.String);
226-
TableAddCol (ParserToken.Value, '[',
227-
(int) ParserToken.Array);
228-
TableAddCol (ParserToken.Value, '{',
229-
(int) ParserToken.Object);
230-
TableAddCol (ParserToken.Value, (int) ParserToken.Number,
231-
(int) ParserToken.Number);
232-
TableAddCol (ParserToken.Value, (int) ParserToken.True,
233-
(int) ParserToken.True);
234-
TableAddCol (ParserToken.Value, (int) ParserToken.False,
235-
(int) ParserToken.False);
236-
TableAddCol (ParserToken.Value, (int) ParserToken.Null,
237-
(int) ParserToken.Null);
238-
239-
TableAddRow (ParserToken.ValueRest);
240-
TableAddCol (ParserToken.ValueRest, ',',
241-
',',
242-
(int) ParserToken.Value,
243-
(int) ParserToken.ValueRest);
244-
TableAddCol (ParserToken.ValueRest, ']',
245-
(int) ParserToken.Epsilon);
145+
IDictionary<int, IDictionary<int, int[]>> parse_table = new Dictionary<int, IDictionary<int, int[]>> ();
146+
147+
TableAddRow (parse_table, ParserToken.Array);
148+
TableAddCol (parse_table, ParserToken.Array, '[',
149+
'[',
150+
(int) ParserToken.ArrayPrime);
151+
152+
TableAddRow (parse_table, ParserToken.ArrayPrime);
153+
TableAddCol (parse_table, ParserToken.ArrayPrime, '"',
154+
(int) ParserToken.Value,
155+
156+
(int) ParserToken.ValueRest,
157+
']');
158+
TableAddCol (parse_table, ParserToken.ArrayPrime, '[',
159+
(int) ParserToken.Value,
160+
(int) ParserToken.ValueRest,
161+
']');
162+
TableAddCol (parse_table, ParserToken.ArrayPrime, ']',
163+
']');
164+
TableAddCol (parse_table, ParserToken.ArrayPrime, '{',
165+
(int) ParserToken.Value,
166+
(int) ParserToken.ValueRest,
167+
']');
168+
TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.Number,
169+
(int) ParserToken.Value,
170+
(int) ParserToken.ValueRest,
171+
']');
172+
TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.True,
173+
(int) ParserToken.Value,
174+
(int) ParserToken.ValueRest,
175+
']');
176+
TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.False,
177+
(int) ParserToken.Value,
178+
(int) ParserToken.ValueRest,
179+
']');
180+
TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.Null,
181+
(int) ParserToken.Value,
182+
(int) ParserToken.ValueRest,
183+
']');
184+
185+
TableAddRow (parse_table, ParserToken.Object);
186+
TableAddCol (parse_table, ParserToken.Object, '{',
187+
'{',
188+
(int) ParserToken.ObjectPrime);
189+
190+
TableAddRow (parse_table, ParserToken.ObjectPrime);
191+
TableAddCol (parse_table, ParserToken.ObjectPrime, '"',
192+
(int) ParserToken.Pair,
193+
(int) ParserToken.PairRest,
194+
'}');
195+
TableAddCol (parse_table, ParserToken.ObjectPrime, '}',
196+
'}');
197+
198+
TableAddRow (parse_table, ParserToken.Pair);
199+
TableAddCol (parse_table, ParserToken.Pair, '"',
200+
(int) ParserToken.String,
201+
':',
202+
(int) ParserToken.Value);
203+
204+
TableAddRow (parse_table, ParserToken.PairRest);
205+
TableAddCol (parse_table, ParserToken.PairRest, ',',
206+
',',
207+
(int) ParserToken.Pair,
208+
(int) ParserToken.PairRest);
209+
TableAddCol (parse_table, ParserToken.PairRest, '}',
210+
(int) ParserToken.Epsilon);
211+
212+
TableAddRow (parse_table, ParserToken.String);
213+
TableAddCol (parse_table, ParserToken.String, '"',
214+
'"',
215+
(int) ParserToken.CharSeq,
216+
'"');
217+
218+
TableAddRow (parse_table, ParserToken.Text);
219+
TableAddCol (parse_table, ParserToken.Text, '[',
220+
(int) ParserToken.Array);
221+
TableAddCol (parse_table, ParserToken.Text, '{',
222+
(int) ParserToken.Object);
223+
224+
TableAddRow (parse_table, ParserToken.Value);
225+
TableAddCol (parse_table, ParserToken.Value, '"',
226+
(int) ParserToken.String);
227+
TableAddCol (parse_table, ParserToken.Value, '[',
228+
(int) ParserToken.Array);
229+
TableAddCol (parse_table, ParserToken.Value, '{',
230+
(int) ParserToken.Object);
231+
TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.Number,
232+
(int) ParserToken.Number);
233+
TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.True,
234+
(int) ParserToken.True);
235+
TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.False,
236+
(int) ParserToken.False);
237+
TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.Null,
238+
(int) ParserToken.Null);
239+
240+
TableAddRow (parse_table, ParserToken.ValueRest);
241+
TableAddCol (parse_table, ParserToken.ValueRest, ',',
242+
',',
243+
(int) ParserToken.Value,
244+
(int) ParserToken.ValueRest);
245+
TableAddCol (parse_table, ParserToken.ValueRest, ']',
246+
(int) ParserToken.Epsilon);
247+
248+
return parse_table;
246249
}
247250

248-
private static void TableAddCol (ParserToken row, int col,
251+
private static void TableAddCol (IDictionary<int, IDictionary<int, int[]>> parse_table, ParserToken row, int col,
249252
params int[] symbols)
250253
{
251254
parse_table[(int) row].Add (col, symbols);
252255
}
253256

254-
private static void TableAddRow (ParserToken rule)
257+
private static void TableAddRow (IDictionary<int, IDictionary<int, int[]>> parse_table, ParserToken rule)
255258
{
256259
parse_table.Add ((int) rule, new Dictionary<int, int[]> ());
257260
}
@@ -266,7 +269,7 @@ private void ProcessNumber (string number)
266269
number.IndexOf ('E') != -1) {
267270

268271
double n_double;
269-
if (Double.TryParse (number, out n_double)) {
272+
if (double.TryParse (number, NumberStyles.Any, CultureInfo.InvariantCulture, out n_double)) {
270273
token = JsonToken.Double;
271274
token_value = n_double;
272275

@@ -275,23 +278,23 @@ private void ProcessNumber (string number)
275278
}
276279

277280
int n_int32;
278-
if (Int32.TryParse (number, out n_int32)) {
281+
if (int.TryParse (number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_int32)) {
279282
token = JsonToken.Int;
280283
token_value = n_int32;
281284

282285
return;
283286
}
284287

285288
long n_int64;
286-
if (Int64.TryParse (number, out n_int64)) {
289+
if (long.TryParse (number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_int64)) {
287290
token = JsonToken.Long;
288291
token_value = n_int64;
289292

290293
return;
291294
}
292295

293296
ulong n_uint64;
294-
if (UInt64.TryParse(number, out n_uint64))
297+
if (ulong.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_uint64))
295298
{
296299
token = JsonToken.Long;
297300
token_value = n_uint64;

src/LitJson/JsonWriter.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal class WriterContext
3939
public class JsonWriter
4040
{
4141
#region Fields
42-
private static NumberFormatInfo number_format;
42+
private static readonly NumberFormatInfo number_format;
4343

4444
private WriterContext context;
4545
private Stack<WriterContext> ctx_stack;
@@ -50,6 +50,7 @@ public class JsonWriter
5050
private StringBuilder inst_string_builder;
5151
private bool pretty_print;
5252
private bool validate;
53+
private bool lower_case_properties;
5354
private TextWriter writer;
5455
#endregion
5556

@@ -76,6 +77,11 @@ public bool Validate {
7677
get { return validate; }
7778
set { validate = value; }
7879
}
80+
81+
public bool LowerCaseProperties {
82+
get { return lower_case_properties; }
83+
set { lower_case_properties = value; }
84+
}
7985
#endregion
8086

8187

@@ -166,6 +172,7 @@ private void Init ()
166172
indent_value = 4;
167173
pretty_print = false;
168174
validate = true;
175+
lower_case_properties = false;
169176

170177
ctx_stack = new Stack<WriterContext> ();
171178
context = new WriterContext ();
@@ -442,14 +449,17 @@ public void WritePropertyName (string property_name)
442449
{
443450
DoValidation (Condition.Property);
444451
PutNewline ();
452+
string propertyName = (property_name == null || !lower_case_properties)
453+
? property_name
454+
: property_name.ToLowerInvariant();
445455

446-
PutString (property_name);
456+
PutString (propertyName);
447457

448458
if (pretty_print) {
449-
if (property_name.Length > context.Padding)
450-
context.Padding = property_name.Length;
459+
if (propertyName.Length > context.Padding)
460+
context.Padding = propertyName.Length;
451461

452-
for (int i = context.Padding - property_name.Length;
462+
for (int i = context.Padding - propertyName.Length;
453463
i >= 0; i--)
454464
writer.Write (' ');
455465

0 commit comments

Comments
 (0)