public void Roundtrip_WorksGood() { Player player = PersonFactory.CreatePlayer(); var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, }; var serializer = JsonSerializer.CreateDefault(settings); JToken token = JToken.FromObject(player, serializer); var converter = new JTokenConverter(JsonXmlSettings.Defaults); var xnode = converter.ToXNode(token); var actualXml = new XElement( XNamespace.None.GetName("wrap"), new XAttribute(XNamespace.Xmlns.GetName("jxml"), "http://www.xmlsh.org/jxml"), new XAttribute(XNamespace.Xmlns.GetName("jsonx"), "http://www.json.net/xml"), xnode); var expectedXml = XDocument.Parse(@"<wrap xmlns:jxml=""http://www.xmlsh.org/jxml"" xmlns:jsonx=""http://www.json.net/xml""> <jxml:object> <jxml:member name=""TelephoneNumbers""> <jxml:array> <jxml:object> <jxml:member name=""Type""> <jsonx:integer>0</jsonx:integer> </jxml:member> <jxml:member name=""CountryCode""> <jxml:string>44</jxml:string> </jxml:member> <jxml:member name=""AreaCode""> <jxml:string>151</jxml:string> </jxml:member> <jxml:member name=""LocalNumber""> <jxml:string>123 4567</jxml:string> </jxml:member> <jxml:member name=""RawNumber""> <jxml:null /> </jxml:member> </jxml:object> <jxml:object> <jxml:member name=""Type""> <jsonx:integer>1</jsonx:integer> </jxml:member> <jxml:member name=""CountryCode""> <jxml:null /> </jxml:member> <jxml:member name=""AreaCode""> <jxml:null /> </jxml:member> <jxml:member name=""LocalNumber""> <jxml:null /> </jxml:member> <jxml:member name=""RawNumber""> <jxml:string>+31 (141) 123 4567</jxml:string> </jxml:member> </jxml:object> </jxml:array> </jxml:member> <jxml:member name=""Addresses""> <jxml:array> <jxml:object> <jxml:member name=""Type""> <jsonx:integer>0</jsonx:integer> </jxml:member> <jxml:member name=""PropertyNumber""> <jxml:null /> </jxml:member> <jxml:member name=""PropertyName""> <jxml:string>14</jxml:string> </jxml:member> <jxml:member name=""Street""> <jxml:string>Some Road</jxml:string> </jxml:member> <jxml:member name=""Locality""> <jxml:string>Some town</jxml:string> </jxml:member> <jxml:member name=""Region""> <jxml:string>My county</jxml:string> </jxml:member> <jxml:member name=""Country""> <jxml:string>My country</jxml:string> </jxml:member> <jxml:member name=""PostalCode""> <jxml:string>RG5 3AS</jxml:string> </jxml:member> </jxml:object> <jxml:object> <jxml:member name=""Type""> <jsonx:integer>1</jsonx:integer> </jxml:member> <jxml:member name=""PropertyNumber""> <jsonx:integer>5</jsonx:integer> </jxml:member> <jxml:member name=""PropertyName""> <jxml:null /> </jxml:member> <jxml:member name=""Street""> <jxml:string>Some Road</jxml:string> </jxml:member> <jxml:member name=""Locality""> <jxml:string>Some town</jxml:string> </jxml:member> <jxml:member name=""Region""> <jxml:string>My county</jxml:string> </jxml:member> <jxml:member name=""Country""> <jxml:string>My country</jxml:string> </jxml:member> <jxml:member name=""PostalCode""> <jxml:string>RG5 3AS</jxml:string> </jxml:member> </jxml:object> </jxml:array> </jxml:member> <jxml:member name=""DateOfBirth""> <jsonx:dateTime>1965-04-15T00:00:00</jsonx:dateTime> </jxml:member> <jxml:member name=""Notes""> <jxml:array> <jxml:object> <jxml:member name=""$type""> <jxml:string>JsonXml.Test.POCOs.SpecialNote, JsonXml.Test</jxml:string> </jxml:member> <jxml:member name=""Blah""> <jsonx:integer>1</jsonx:integer> </jxml:member> <jxml:member name=""Note""> <jxml:string>This is some note content unicode-->ᶍ<--unicode</jxml:string> </jxml:member> <jxml:member name=""Recorded""> <jsonx:dateTimeOffset>2013-04-06T10:53:28.456+05:00</jsonx:dateTimeOffset> </jxml:member> </jxml:object> </jxml:array> </jxml:member> <jxml:member name=""Image""> <jsonx:bytes>EhUX</jsonx:bytes> </jxml:member> <jxml:member name=""Website""> <jsonx:uri>http://mywebsite.com/</jsonx:uri> </jxml:member> <jxml:member name=""TimeWithClub""> <jsonx:duration>P237DT5H4M17S</jsonx:duration> </jxml:member> <jxml:member name=""ID""> <jsonx:uuid>0d476eb3-0f4d-40ef-81a7-ea9d2bdefc18</jsonx:uuid> </jxml:member> <jxml:member name=""Name""> <jxml:object> <jxml:member name=""Title""> <jxml:string>Mr</jxml:string> </jxml:member> <jxml:member name=""FirstName""> <jxml:string>Joe</jxml:string> </jxml:member> <jxml:member name=""LastName""> <jxml:string>Bloggs</jxml:string> </jxml:member> </jxml:object> </jxml:member> </jxml:object> </wrap>").FirstNode; Assert.IsTrue(XNode.DeepEquals(expectedXml, actualXml), "XNode should be identical"); var token2 = converter.ToJToken(xnode); var player2 = token2.ToObject <Player>(serializer); JToken token3 = JToken.FromObject(player2, serializer); Assert.IsTrue(JToken.DeepEquals(token, token3), "Tokens should match"); }