+2010-03-09 Atsushi Enomoto <atsushi@ximian.com>
+
+ * JsonSerializationWriter.cs, JsonSerializationReader.cs,
+ JsonWriter.cs : Fix DateTime serialization and "\/" string escape
+ issues. Fixed bug #586169.
+
2010-02-24 Atsushi Enomoto <atsushi@ximian.com>
* JsonWriter.cs : write NaN, INF, -INF as JSON string, not JSON number.
return Convert.ChangeType (l, type, null);
case TypeCode.Boolean:
return reader.ReadElementContentAsBoolean ();
+ case TypeCode.DateTime:
+ // it does not use ReadElementContentAsDateTime(). Different string format.
+ var s = reader.ReadElementContentAsString ();
+ if (s.Length < 2 || !s.StartsWith ("/Date(", StringComparison.Ordinal) || !s.EndsWith (")/", StringComparison.Ordinal))
+ throw new XmlException ("Invalid JSON DateTime format. The value format should be '/Date(UnixTime)/'");
+ return new DateTime (1970, 1, 1).AddMilliseconds (long.Parse (s.Substring (6, s.Length - 8)));
default:
if (type == typeof (Guid)) {
return new Guid (reader.ReadElementContentAsString ());
else
return new Uri (reader.ReadElementContentAsString ());
} else if (type == typeof (XmlQualifiedName)) {
- string s = reader.ReadElementContentAsString ();
+ s = reader.ReadElementContentAsString ();
int idx = s.IndexOf (':');
return idx < 0 ? new XmlQualifiedName (s) : new XmlQualifiedName (s.Substring (0, idx), s.Substring (idx + 1));
} else if (type != typeof (object)) {
else
writer.WriteString ("false");
break;
+ case TypeCode.DateTime:
+ writer.WriteString (String.Format (CultureInfo.InvariantCulture, "/Date({0})/", ((DateTime) graph).Subtract (new DateTime (1970, 1, 1)).TotalMilliseconds));
+ break;
default:
if (graph is Guid) {
goto case TypeCode.String;
case '\\':
AppendBuffer (ref sb, input, start, i, @"\\");
break;
- //case '/':
- // AppendBuffer (ref sb, input, start, i, @"\/");
- // break;
+ case '/':
+ AppendBuffer (ref sb, input, start, i, @"\/");
+ break;
case '\x8':
AppendBuffer (ref sb, input, start, i, @"\b");
break;
+2010-03-09 Atsushi Enomoto <atsushi@ximian.com>
+
+ * DataContractJsonSerializerTest.cs : add test for bug #586169.
+ * JsonWriterTest.cs : add standalone write case for "\/".
+
2010-01-27 Atsushi Enomoto <atsushi@ximian.com>
* DataContractJsonSerializerTest.cs :
Assert.IsTrue (Double.IsNegativeInfinity ((double) ReadWriteObject (typeof (double), Double.NegativeInfinity, "-INF")));
Assert.IsTrue (Double.IsPositiveInfinity ((double) ReadWriteObject (typeof (double), Double.PositiveInfinity, "INF")));
}
+
+ [Test]
+ public void ReadWriteDateTime ()
+ {
+ var ms = new MemoryStream ();
+ DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof (Query));
+ Query query = new Query () {
+ StartDate = DateTime.Today.ToUniversalTime().AddMonths(-1),
+ EndDate = DateTime.Today.ToUniversalTime()
+ };
+ serializer.WriteObject (ms, query);
+ Assert.AreEqual ("{\"StartDate\":\"\\/Date(1265641200000)\\/\",\"EndDate\":\"\\/Date(1268060400000)\\/\"}", Encoding.UTF8.GetString (ms.ToArray ()), "#1");
+ ms.Position = 0;
+ Console.WriteLine (new StreamReader (ms).ReadToEnd ());
+ ms.Position = 0;
+ var q = (Query) serializer.ReadObject(ms);
+ Assert.AreEqual (query.StartDate, q.StartDate, "#2");
+ Assert.AreEqual (query.EndDate, q.EndDate, "#3");
+ }
}
public class TestData
public List<KeyValuePair<string,string>> TestData = new List<KeyValuePair<string,string>>();
}
+ [DataContract] // bug #586169
+ public class Query
+ {
+ [DataMember (Order=1)]
+ public DateTime StartDate { get; set; }
+ [DataMember (Order=2)]
+ public DateTime EndDate { get; set; }
+ }
}
[DataContract]
// WriteEndAttribute().
w.Close ();
}
+
+ [Test]
+ public void WriteSlashEscaped ()
+ {
+ w.WriteStartElement ("root");
+ w.WriteString ("/my date/");
+ w.WriteEndElement ();
+ w.Close ();
+ Assert.AreEqual ("\"\\/my date\\/\"", ResultString);
+ }
}
}