# HG changeset patch # User cin # Date 2017-09-09 00:53:13 # Node ID 8d5de4eb9c2cd3628fd2b2dc3191e278909da7d9 # Parent 9428ea36838ea946c43c01d27d66521aa2398fd5 Reimplemented JsonXmlReader, added support for null values: JSON null values are mapped to empty nodes with 'xsi:nil' attribute set to 'true' diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -18,3 +18,6 @@ MonoPlay/obj/ Implab.Test/Implab.Format.Test/bin/ Implab.Test/Implab.Format.Test/obj/ *.suo +Implab.Format.Test/bin/ +Implab.Format.Test/obj/ +packages/ diff --git a/Implab.Test/Implab.Format.Test/Implab.Format.Test.csproj b/Implab.Format.Test/Implab.Format.Test.csproj rename from Implab.Test/Implab.Format.Test/Implab.Format.Test.csproj rename to Implab.Format.Test/Implab.Format.Test.csproj --- a/Implab.Test/Implab.Format.Test/Implab.Format.Test.csproj +++ b/Implab.Format.Test/Implab.Format.Test.csproj @@ -31,25 +31,27 @@ false + + ..\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll + True + - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll - + - + {F550F1F8-8746-4AD0-9614-855F4C4B7F05} Implab - + - + \ No newline at end of file diff --git a/Implab.Test/Implab.Format.Test/JsonTests.cs b/Implab.Format.Test/JsonTests.cs rename from Implab.Test/Implab.Format.Test/JsonTests.cs rename to Implab.Format.Test/JsonTests.cs --- a/Implab.Test/Implab.Format.Test/JsonTests.cs +++ b/Implab.Format.Test/JsonTests.cs @@ -2,7 +2,10 @@ using System; using Implab.Formats.JSON; using Implab.Automaton; - +using Implab.Xml; +using System.Xml; +using System.Text; + namespace Implab.Format.Test { [TestFixture] public class JsonTests { @@ -10,7 +13,7 @@ namespace Implab.Format.Test { public void TestScannerValidTokens() { using (var scanner = new JSONScanner(@"9123, -123, 0, 0.1, -0.2, -0.1e3, 1.3E-3, ""some \t\n\u0020 text"", literal []{}:")) { - Tuple[] expexted = { + Tuple[] expexted = { new Tuple(JsonTokenType.Number, 9123d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, -123d), @@ -37,8 +40,8 @@ namespace Implab.Format.Test { object value; JsonTokenType tokenType; - for (var i = 0; i < expexted.Length; i++) { - + for (var i = 0; i < expexted.Length; i++) { + Assert.IsTrue(scanner.ReadToken(out value, out tokenType)); Assert.AreEqual(expexted[i].Item1, tokenType); Assert.AreEqual(expexted[i].Item2, value); @@ -50,7 +53,7 @@ namespace Implab.Format.Test { [Test] public void TestScannerBadTokens() { - var bad = new [] { + var bad = new[] { " 1", " literal", " \"", @@ -66,22 +69,76 @@ namespace Implab.Format.Test { "-.123" }; - foreach (var json in bad) + foreach (var json in bad) { using (var scanner = new JSONScanner(json)) { try { object value; JsonTokenType token; scanner.ReadToken(out value, out token); - if (!Object.Equals(value,json)) { - Console.WriteLine("'{0}' is read as {1}", json, value is String ? String.Format("'{0}'", value) : value ); + if (!Object.Equals(value, json)) { + Console.WriteLine("'{0}' is read as {1}", json, value is String ? String.Format("'{0}'", value) : value); continue; } Assert.Fail("Token '{0}' shouldn't pass", json); } catch (ParserException e) { Console.WriteLine(e.Message); } - } - + } + } + } + + [Test] + public void JsonXmlReaderSimpleTest() { + var json = "\"some text\""; + //Console.WriteLine($"JSON: {json}"); + //Console.WriteLine("XML"); + /*using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", RootName = "string", NodesPrefix = "json" })) { + Assert.AreEqual(xmlReader.ReadState, System.Xml.ReadState.Initial); + + AssertRead(xmlReader, XmlNodeType.XmlDeclaration); + AssertRead(xmlReader, XmlNodeType.Element); + AssertRead(xmlReader, XmlNodeType.Text); + AssertRead(xmlReader, XmlNodeType.EndElement); + Assert.IsFalse(xmlReader.Read()); + }*/ + + //DumpJsonParse("\"text value\""); + //DumpJsonParse("null"); + //DumpJsonParse("true"); + //DumpJsonParse("{}"); + //DumpJsonParse("[]"); + DumpJsonParse("{\"one\":1, \"two\":2}"); + DumpJsonParse("[1,2,3]"); + DumpJsonParse("[{\"info\": [7,8,9]}]"); + DumpJsonFlatParse("[1,2,[3,4],{\"info\": [5,6]},{\"num\": [7,8,null]}, null,[null]]"); + } + + void AssertRead(XmlReader reader, XmlNodeType expected) { + Assert.IsTrue(reader.Read()); + Console.WriteLine($"{new string(' ', reader.Depth*2)}{reader}"); + Assert.AreEqual(expected, reader.NodeType); + } + + void DumpJsonParse(string json) { + Console.WriteLine($"JSON: {json}"); + Console.WriteLine("XML"); + using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "json" })) { + while (xmlReader.Read()) + Console.WriteLine($"{new string(' ', xmlReader.Depth * 2)}{xmlReader}"); + } + } + + void DumpJsonFlatParse(string json) { + Console.WriteLine($"JSON: {json}"); + Console.WriteLine("XML"); + using (var xmlWriter = XmlWriter.Create(Console.Out, new XmlWriterSettings { + Indent = true, + CloseOutput = false, + ConformanceLevel = ConformanceLevel.Document + })) + using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "", FlattenArrays = true })) { + xmlWriter.WriteNode(xmlReader, false); + } } } } diff --git a/Implab.Test/Implab.Format.Test/packages.config b/Implab.Format.Test/packages.config rename from Implab.Test/Implab.Format.Test/packages.config rename to Implab.Format.Test/packages.config --- a/Implab.Test/Implab.Format.Test/packages.config +++ b/Implab.Format.Test/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Implab.Test/Implab.Test.csproj b/Implab.Test/Implab.Test.csproj --- a/Implab.Test/Implab.Test.csproj +++ b/Implab.Test/Implab.Test.csproj @@ -76,9 +76,7 @@ Implab - - - +