diff --git a/Src/Newtonsoft.Json.Tests/JsonRawTests.cs b/Src/Newtonsoft.Json.Tests/JsonRawTests.cs new file mode 100644 index 00000000..e2ae30ec --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/JsonRawTests.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; + +namespace Newtonsoft.Json.Tests +{ + public class JsonRawTests : TestFixtureBase + { + [Test] + public void Create() + { + JsonRaw raw = new JsonRaw("Test"); + Assert.AreEqual("Test", raw.Content); + Assert.AreEqual("Test", raw.ToString()); + } + + [Test] + public void EqualsShouldEqualOnSameContent() + { + JsonRaw r1 = new JsonRaw("Test"); + JsonRaw r2 = new JsonRaw("Test"); + + Assert.AreEqual(r1, r2); + Assert.AreNotEqual(r1, null); + Assert.IsFalse(r1.Equals(null)); + } + + [Test] + public void GetHashCodeShouldEqualOnSameContent() + { + JsonRaw r1 = new JsonRaw("Test"); + JsonRaw r2 = new JsonRaw("Test"); + JsonRaw r3 = new JsonRaw("Test1"); + + Assert.AreEqual(r1.GetHashCode(), r2.GetHashCode()); + Assert.AreNotEqual(r1.GetHashCode(), r3.GetHashCode()); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs index c2fb5eb2..7fcf1e57 100644 --- a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs @@ -1335,5 +1335,68 @@ keyword such as type of business."" json = JavaScriptConvert.SerializeObject((int?)1); Assert.AreEqual("1", json); } + + public class PersonRaw + { + private Guid _internalId; + private string _firstName; + private string _lastName; + private JsonRaw _rawContent; + + [JsonIgnore] + public Guid InternalId + { + get { return _internalId; } + set { _internalId = value; } + } + + [JsonProperty("first_name")] + public string FirstName + { + get { return _firstName; } + set { _firstName = value; } + } + + public JsonRaw RawContent + { + get { return _rawContent; } + set { _rawContent = value; } + } + + [JsonProperty("last_name")] + public string LastName + { + get { return _lastName; } + set { _lastName = value; } + } + } + + [Test] + public void SerializeJsonRaw() + { + PersonRaw personRaw = new PersonRaw + { + FirstName = "FirstNameValue", + RawContent = new JsonRaw("[1,2,3,4,5]"), + LastName = "LastNameValue" + }; + + string json; + + json = JavaScriptConvert.SerializeObject(personRaw); + Assert.AreEqual(@"{""first_name"":""FirstNameValue"",""RawContent"":[1,2,3,4,5],""last_name"":""LastNameValue""}", json); + } + + [Test] + public void DeserializeJsonRaw() + { + string json = @"{""first_name"":""FirstNameValue"",""RawContent"":[1,2,3,4,5],""last_name"":""LastNameValue""}"; + + PersonRaw personRaw = JavaScriptConvert.DeserializeObject(json); + + Assert.AreEqual("FirstNameValue", personRaw.FirstName); + Assert.AreEqual("[1,2,3,4,5]", personRaw.RawContent.Content); + Assert.AreEqual("LastNameValue", personRaw.LastName); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs index 169a556c..4e1250ae 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs @@ -280,6 +280,8 @@ namespace Newtonsoft.Json.Tests jsonWriter.WriteValue(float.PositiveInfinity); jsonWriter.WriteValue(float.NegativeInfinity); jsonWriter.WriteEndArray(); + + jsonWriter.Flush(); } string expected = @"[ @@ -294,5 +296,92 @@ namespace Newtonsoft.Json.Tests Assert.AreEqual(expected, result); } + + [Test] + public void WriteRawInStart() + { + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + + using (JsonWriter jsonWriter = new JsonTextWriter(sw)) + { + jsonWriter.Formatting = Formatting.Indented; + + jsonWriter.WriteRaw("[1,2,3,4,5]"); + jsonWriter.WriteWhitespace(" "); + jsonWriter.WriteStartArray(); + jsonWriter.WriteValue(double.NaN); + jsonWriter.WriteEndArray(); + } + + string expected = @"[1,2,3,4,5] [ + NaN +]"; + string result = sb.ToString(); + + Assert.AreEqual(expected, result); + } + + [Test] + public void WriteRawInArray() + { + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + + using (JsonWriter jsonWriter = new JsonTextWriter(sw)) + { + jsonWriter.Formatting = Formatting.Indented; + + jsonWriter.WriteStartArray(); + jsonWriter.WriteValue(double.NaN); + jsonWriter.WriteRaw(",[1,2,3,4,5]"); + jsonWriter.WriteRaw(",[1,2,3,4,5]"); + jsonWriter.WriteValue(float.NaN); + jsonWriter.WriteEndArray(); + } + + string expected = @"[ + NaN,[1,2,3,4,5],[1,2,3,4,5], + NaN +]"; + string result = sb.ToString(); + + Assert.AreEqual(expected, result); + } + + [Test] + public void WriteRawInObject() + { + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + + using (JsonWriter jsonWriter = new JsonTextWriter(sw)) + { + jsonWriter.Formatting = Formatting.Indented; + + jsonWriter.WriteStartObject(); + jsonWriter.WriteRaw(@"""PropertyName"":[1,2,3,4,5]"); + jsonWriter.WriteEnd(); + } + + string expected = @"{""PropertyName"":[1,2,3,4,5]}"; + string result = sb.ToString(); + + Assert.AreEqual(expected, result); + } + + [Test] + public void WriteToken() + { + JsonTextReader reader = new JsonTextReader(new StringReader("[1,2,3,4,5]")); + reader.Read(); + reader.Read(); + + StringWriter sw = new StringWriter(); + JsonTextWriter writer = new JsonTextWriter(sw); + writer.WriteToken(reader); + + Assert.AreEqual("1", sw.ToString()); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs index 33d5fce0..9598be61 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs @@ -229,5 +229,85 @@ Parameter name: arrayIndex")] ((ICollection>)o).CopyTo(new KeyValuePair[3], 1); } + + [Test] + public void FromObjectRaw() + { + JsonSerializerTest.PersonRaw raw = new JsonSerializerTest.PersonRaw + { + FirstName = "FirstNameValue", + RawContent = new JsonRaw("[1,2,3,4,5]"), + LastName = "LastNameValue" + }; + + JObject o = JObject.FromObject(raw); + + Assert.AreEqual("FirstNameValue", (string)o["first_name"]); + Assert.AreEqual(JsonTokenType.Raw, ((JValue)o["RawContent"]).Type); + Assert.AreEqual("[1,2,3,4,5]", (string)o["RawContent"]); + Assert.AreEqual("LastNameValue", (string)o["last_name"]); + } + + [Test] + public void JsonTokenReader() + { + JsonSerializerTest.PersonRaw raw = new JsonSerializerTest.PersonRaw + { + FirstName = "FirstNameValue", + RawContent = new JsonRaw("[1,2,3,4,5]"), + LastName = "LastNameValue" + }; + + JObject o = JObject.FromObject(raw); + + JsonReader reader = new JsonTokenReader(o); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.Raw, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.EndObject, reader.TokenType); + + Assert.IsFalse(reader.Read()); + } + + [Test] + public void DeserializeFromRaw() + { + JsonSerializerTest.PersonRaw raw = new JsonSerializerTest.PersonRaw + { + FirstName = "FirstNameValue", + RawContent = new JsonRaw("[1,2,3,4,5]"), + LastName = "LastNameValue" + }; + + JObject o = JObject.FromObject(raw); + + JsonReader reader = new JsonTokenReader(o); + JsonSerializer serializer = new JsonSerializer(); + raw = (JsonSerializerTest.PersonRaw)serializer.Deserialize(reader, typeof(JsonSerializerTest.PersonRaw)); + + Assert.AreEqual("FirstNameValue", raw.FirstName); + Assert.AreEqual("LastNameValue", raw.LastName); + Assert.AreEqual("[1,2,3,4,5]", raw.RawContent.Content); + } } } diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj index 3bd77122..c2c82e6d 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj @@ -63,6 +63,7 @@ + diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj index 8fc31273..3f475536 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj @@ -119,6 +119,7 @@ + diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj index eadb6a8e..816f93ef 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj @@ -73,6 +73,7 @@ + diff --git a/Src/Newtonsoft.Json/Identifier.cs b/Src/Newtonsoft.Json/JsonRaw.cs similarity index 58% rename from Src/Newtonsoft.Json/Identifier.cs rename to Src/Newtonsoft.Json/JsonRaw.cs index 91e5d6ee..ce9152c4 100644 --- a/Src/Newtonsoft.Json/Identifier.cs +++ b/Src/Newtonsoft.Json/JsonRaw.cs @@ -31,37 +31,36 @@ using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; using System.ComponentModel; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json { /// - /// + /// Raw JSON content. /// - public class Identifier + public class JsonRaw { - private string _name; + private string _content; /// - /// Gets the name. + /// Gets the raw JSON string. /// - /// The name. - public string Name + /// The raw JSON string. + public string Content { - get { return _name; } + get { return _content; } } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// The name. - public Identifier(string name) + /// The content. + public JsonRaw(string content) { - _name = name; - } + ValidationUtils.ArgumentNotNull(content, "content"); - private static bool IsAsciiLetter(char c) - { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); + _content = content; } /// @@ -74,36 +73,11 @@ namespace Newtonsoft.Json /// The parameter is null. public override bool Equals(object obj) { - Identifier function = obj as Identifier; + JsonRaw raw = obj as JsonRaw; + if (raw == null) + return false; - return Equals(function); - } - - /// - /// Equalses the specified function. - /// - /// The function. - /// - public bool Equals(Identifier function) - { - return (_name == function.Name); - } - - /// - /// Equalses the specified a. - /// - /// A. - /// The b. - /// - public static bool Equals(Identifier a, Identifier b) - { - if (a == b) - return true; - - if (a != null && b != null) - return a.Equals(b); - - return false; + return (string.Compare(_content, raw.Content, StringComparison.OrdinalIgnoreCase) == 0); } /// @@ -114,7 +88,7 @@ namespace Newtonsoft.Json /// public override int GetHashCode() { - return _name.GetHashCode(); + return _content.GetHashCode(); } /// @@ -125,29 +99,23 @@ namespace Newtonsoft.Json /// public override string ToString() { - return _name; + return _content; } /// - /// Implements the operator ==. + /// Creates an instance of with the content of the reader's current token. /// - /// A. - /// The b. - /// The result of the operator. - public static bool operator ==(Identifier a, Identifier b) + /// The reader. + /// An instance of with the content of the reader's current token. + public static JsonRaw Create(JsonReader reader) { - return Identifier.Equals(a, b); - } + using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) + using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) + { + jsonWriter.WriteToken(reader); - /// - /// Implements the operator !=. - /// - /// A. - /// The b. - /// The result of the operator. - public static bool operator !=(Identifier a, Identifier b) - { - return !Identifier.Equals(a, b); + return new JsonRaw(sw.ToString()); + } } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonReader.cs b/Src/Newtonsoft.Json/JsonReader.cs index 7e926a6b..cc3ab4c9 100644 --- a/Src/Newtonsoft.Json/JsonReader.cs +++ b/Src/Newtonsoft.Json/JsonReader.cs @@ -276,6 +276,7 @@ namespace Newtonsoft.Json case JsonToken.Null: case JsonToken.Date: case JsonToken.String: + case JsonToken.Raw: _currentState = State.PostValue; break; } @@ -351,6 +352,7 @@ namespace Newtonsoft.Json case JsonToken.EndArray: case JsonToken.EndConstructor: case JsonToken.Date: + case JsonToken.Raw: return false; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("token", token, "Unexpected JsonToken value."); diff --git a/Src/Newtonsoft.Json/JsonSerializer.cs b/Src/Newtonsoft.Json/JsonSerializer.cs index b2bbf1c5..67cac60b 100644 --- a/Src/Newtonsoft.Json/JsonSerializer.cs +++ b/Src/Newtonsoft.Json/JsonSerializer.cs @@ -262,6 +262,10 @@ namespace Newtonsoft.Json { return converter.ReadJson(reader, objectType); } + else if (objectType == typeof(JsonRaw)) + { + return JsonRaw.Create(reader); + } else { switch (reader.TokenType) @@ -723,9 +727,9 @@ namespace Newtonsoft.Json { SerializeEnumerable(writer, (IEnumerable)value); } - else if (value is Identifier) + else if (value is JsonRaw) { - writer.WriteRaw(value.ToString()); + writer.WriteRaw(((JsonRaw)value).Content, true); } else { diff --git a/Src/Newtonsoft.Json/JsonTextWriter.cs b/Src/Newtonsoft.Json/JsonTextWriter.cs index cd3aa1c2..bb87d944 100644 --- a/Src/Newtonsoft.Json/JsonTextWriter.cs +++ b/Src/Newtonsoft.Json/JsonTextWriter.cs @@ -259,14 +259,14 @@ namespace Newtonsoft.Json } /// - /// Writes raw JavaScript manually. + /// Writes raw JSON. /// - /// The raw JavaScript to write. - public override void WriteRaw(string javaScript) + /// The raw JSON to write. + public override void WriteRaw(string json) { - base.WriteRaw(javaScript); - // hack. some 'raw' or 'other' token perhaps? - WriteValueInternal(javaScript, JsonToken.Undefined); + base.WriteRaw(json); + + _writer.Write(json); } /// diff --git a/Src/Newtonsoft.Json/JsonToken.cs b/Src/Newtonsoft.Json/JsonToken.cs index fc27644b..1e5fae1f 100644 --- a/Src/Newtonsoft.Json/JsonToken.cs +++ b/Src/Newtonsoft.Json/JsonToken.cs @@ -59,6 +59,10 @@ namespace Newtonsoft.Json /// Comment, /// + /// Raw JSON. + /// + Raw, + /// /// An interger. /// Integer, diff --git a/Src/Newtonsoft.Json/JsonWriter.cs b/Src/Newtonsoft.Json/JsonWriter.cs index fce2ffd1..9f34cb43 100644 --- a/Src/Newtonsoft.Json/JsonWriter.cs +++ b/Src/Newtonsoft.Json/JsonWriter.cs @@ -115,6 +115,7 @@ namespace Newtonsoft.Json /* StartConstructor */{ State.ConstructorStart, State.ConstructorStart, State.Error, State.Error, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.Error, State.Error }, /* StartProperty */{ State.Property, State.Error, State.Property, State.Property, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error }, /* Comment */{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, +/* Raw */{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, /* Value */{ State.Start, State.Object, State.Error, State.Error, State.Array, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, }; @@ -309,7 +310,14 @@ namespace Newtonsoft.Json { ValidationUtils.ArgumentNotNull(reader, "reader"); - int currentDepth = (reader.TokenType == JsonToken.None) ? -1 : reader.Depth; + int currentDepth; + + if (reader.TokenType == JsonToken.None) + currentDepth = -1; + else if (!IsStartToken(reader.TokenType)) + currentDepth = reader.Depth + 1; + else + currentDepth = reader.Depth; do { @@ -363,6 +371,9 @@ namespace Newtonsoft.Json case JsonToken.Date: WriteValue((DateTime)reader.Value); break; + case JsonToken.Raw: + WriteRaw((string)reader.Value, true); + break; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("TokenType", reader.TokenType, "Unexpected token type."); } @@ -386,6 +397,19 @@ namespace Newtonsoft.Json } } + private bool IsStartToken(JsonToken token) + { + switch (token) + { + case JsonToken.StartObject: + case JsonToken.StartArray: + case JsonToken.StartConstructor: + return true; + default: + return false; + } + } + private void WriteEnd(JsonTokenType type) { switch (type) @@ -536,7 +560,7 @@ namespace Newtonsoft.Json case JsonToken.Undefined: case JsonToken.Date: // a value is being written - token = 6; + token = 7; break; } @@ -584,13 +608,19 @@ namespace Newtonsoft.Json } /// - /// Writes raw JavaScript manually. + /// Writes raw JSON. /// - /// The raw JavaScript to write. - public virtual void WriteRaw(string javaScript) + /// The raw JSON to write. + public virtual void WriteRaw(string json) { - // hack. some 'raw' or 'other' token perhaps? - AutoComplete(JsonToken.Undefined); + } + + internal void WriteRaw(string json, bool autoCompleteValue) + { + WriteRaw(json); + // hack + if (autoCompleteValue) + AutoComplete(JsonToken.Undefined); } /// diff --git a/Src/Newtonsoft.Json/Linq/JToken.cs b/Src/Newtonsoft.Json/Linq/JToken.cs index 5c46f07b..7a2b5928 100644 --- a/Src/Newtonsoft.Json/Linq/JToken.cs +++ b/Src/Newtonsoft.Json/Linq/JToken.cs @@ -377,7 +377,7 @@ namespace Newtonsoft.Json.Linq private static bool ValidateString(JToken o) { - return (o.Type == JsonTokenType.String || IsNullable(o)); + return (o.Type == JsonTokenType.String || o.Type == JsonTokenType.Comment || o.Type == JsonTokenType.Raw || IsNullable(o)); } private static string GetType(JToken t) diff --git a/Src/Newtonsoft.Json/Linq/JValue.cs b/Src/Newtonsoft.Json/Linq/JValue.cs index a97e7dce..32c18dae 100644 --- a/Src/Newtonsoft.Json/Linq/JValue.cs +++ b/Src/Newtonsoft.Json/Linq/JValue.cs @@ -188,12 +188,23 @@ namespace Newtonsoft.Json.Linq return new JValue(value, JsonTokenType.String); } + + /// + /// Creates a of raw JSON with the given value. + /// + /// The value. + /// A of raw JSON with the given value. + public static JValue CreateRaw(string value) + { + return new JValue(value, JsonTokenType.Raw); + } + private static JsonTokenType GetValueType(JsonTokenType? current, object value) { if (value == null) return JsonTokenType.Null; else if (value is string) - return (current == JsonTokenType.Comment) ? JsonTokenType.Comment : JsonTokenType.String; + return GetStringValueType(current); else if (value is long || value is int || value is short || value is sbyte || value is ulong || value is uint || value is ushort || value is byte) return JsonTokenType.Integer; @@ -209,6 +220,22 @@ namespace Newtonsoft.Json.Linq throw new ArgumentException("Could not determin JSON object type for type {0}.".FormatWith(CultureInfo.InvariantCulture, value.GetType())); } + private static JsonTokenType GetStringValueType(JsonTokenType? current) + { + if (current == null) + return JsonTokenType.String; + + switch (current.Value) + { + case JsonTokenType.Comment: + case JsonTokenType.String: + case JsonTokenType.Raw: + return current.Value; + default: + return JsonTokenType.String; + } + } + /// /// Gets the node type for this . /// @@ -281,6 +308,9 @@ namespace Newtonsoft.Json.Linq writer.WriteValue(Convert.ToDateTime(v, CultureInfo.InvariantCulture)); }, _value); break; + case JsonTokenType.Raw: + writer.WriteRaw(_value.ToString()); + break; case JsonTokenType.Null: writer.WriteNull(); break; diff --git a/Src/Newtonsoft.Json/Linq/JsonTokenReader.cs b/Src/Newtonsoft.Json/Linq/JsonTokenReader.cs index bc518d9a..31e16438 100644 --- a/Src/Newtonsoft.Json/Linq/JsonTokenReader.cs +++ b/Src/Newtonsoft.Json/Linq/JsonTokenReader.cs @@ -164,6 +164,9 @@ namespace Newtonsoft.Json.Linq case JsonTokenType.Date: SetToken(JsonToken.Date, ((JValue)token).Value); break; + case JsonTokenType.Raw: + SetToken(JsonToken.Raw, ((JValue)token).Value); + break; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("Type", token.Type, "Unexpected JsonTokenType."); } diff --git a/Src/Newtonsoft.Json/Linq/JsonTokenType.cs b/Src/Newtonsoft.Json/Linq/JsonTokenType.cs index 3ced4373..65442fd3 100644 --- a/Src/Newtonsoft.Json/Linq/JsonTokenType.cs +++ b/Src/Newtonsoft.Json/Linq/JsonTokenType.cs @@ -86,6 +86,10 @@ namespace Newtonsoft.Json.Linq /// /// A date value. /// - Date + Date, + /// + /// A raw JSON value. + /// + Raw } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Linq/JsonTokenWriter.cs b/Src/Newtonsoft.Json/Linq/JsonTokenWriter.cs index 8b96f2f1..a3c86ec1 100644 --- a/Src/Newtonsoft.Json/Linq/JsonTokenWriter.cs +++ b/Src/Newtonsoft.Json/Linq/JsonTokenWriter.cs @@ -128,7 +128,12 @@ namespace Newtonsoft.Json.Linq private void AddValue(object value, JsonToken token) { - _parent.Add(new JValue(value)); + AddValue(new JValue(value), token); + } + + private void AddValue(JValue value, JsonToken token) + { + _parent.Add(value); if (_parent.Type == JsonTokenType.Property) _parent = _parent.Parent; @@ -154,14 +159,14 @@ namespace Newtonsoft.Json.Linq } /// - /// Writes raw JavaScript manually. + /// Writes raw JSON. /// - /// The raw JavaScript to write. - public override void WriteRaw(string javaScript) + /// The raw JSON to write. + public override void WriteRaw(string json) { - base.WriteRaw(javaScript); - // hack. some 'raw' or 'other' token perhaps? - AddValue(javaScript, JsonToken.Undefined); + base.WriteRaw(json); + // hack + AddValue(JValue.CreateRaw(json), JsonToken.Raw); } /// diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj index 2707860a..bcd60ada 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj @@ -61,7 +61,6 @@ - @@ -69,6 +68,7 @@ + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj index afc49159..f9baa9f4 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj @@ -63,9 +63,6 @@ Converters\XmlNodeConverter.cs - - Identifier.cs - JavaScriptConvert.cs @@ -216,7 +213,6 @@ - @@ -224,6 +220,7 @@ + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.csproj index f6b4f774..cb5cf909 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.csproj @@ -93,7 +93,7 @@ - +