Index: src/json.js |
=================================================================== |
--- src/json.js (revision 6268) |
+++ src/json.js (working copy) |
@@ -184,11 +184,42 @@ |
} |
builder.push("["); |
var len = value.length; |
- for (var i = 0; i < len; i++) { |
- var before = builder.length; |
- BasicJSONSerialize(i, value, stack, builder); |
- if (before == builder.length) builder.push("null"); |
- builder.push(","); |
+ var val = value[0]; |
Erik Corry
2011/01/12 12:44:41
what if len is 0 and value has an accessor on "0"?
sandholm
2011/01/12 13:36:20
Good point. Fix uploaded. Could you have another l
|
+ if (IS_STRING(val)) { |
+ // First entry is a string. Remaining entries are likely to be strings too. |
+ for (var i = 0; i < len; i++) { |
+ val = value[i]; |
+ if (IS_STRING(val)) { |
+ builder.push(%QuoteJSONString(val)); |
+ } else { |
+ var before = builder.length; |
+ BasicJSONSerialize(i, value, stack, builder); |
+ if (before == builder.length) builder.push("null"); |
+ } |
+ builder.push(","); |
+ } |
+ } else if (IS_NUMBER(val)) { |
+ // First entry is a number. Remaining entries are likely to be numbers too. |
+ for (var i = 0; i < len; i++) { |
+ val = value[i]; |
+ if (IS_NUMBER(val)) { |
+ builder.push(NUMBER_IS_FINITE(val) |
+ ? %_NumberToString(val) |
+ : "null"); |
+ } else { |
+ var before = builder.length; |
+ BasicJSONSerialize(i, value, stack, builder); |
+ if (before == builder.length) builder.push("null"); |
+ } |
+ builder.push(","); |
+ } |
+ } else { |
+ for (var i = 0; i < len; i++) { |
+ var before = builder.length; |
+ BasicJSONSerialize(i, value, stack, builder); |
+ if (before == builder.length) builder.push("null"); |
+ builder.push(","); |
+ } |
} |
stack.pop(); |
if (builder.pop() != ",") { |