Context: I need to pass an object containing a large number of properties/fields (to UI Layer from Middle Tier Layer). Among this list of properties, one is of type Version which is not getting deserialized correctly from JSON string format. I have a chosen JSON format over XML as JSON serialization to string will return short string result.
Problem: System.Version does not get deserialized correctly. I have tried two different .NET Libraries. Following are the code snippets for each:
Code Snippet 1 using ServiceStack .NET library:
var version = new Version(1, 2, 3, 0);
string reportJSON = JsonSerializer.SerializeToString<Version>(version);
//{"Major":1,"Minor":2,"Build":3,"Revision":0,"MajorRevision":0,"MinorRevision":0}
Version report2 = JsonSerializer.DeserializeFromString<Version>(reportJSON);
string reportJSON2 = JsonSerializer.SerializeToString<Version>(report2);
//{"Major":0,"Minor":0,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1}
Code Snippet 2 using Newtonsoft .NET library but with same result:
var version = new Version(1, 2, 3, 0);
string reportJSON = JsonConvert.SerializeObject(version);
//{"Major":1,"Minor":2,"Build":3,"Revision":0,"MajorRevision":0,"MinorRevision":0}
Version report2 = JsonConvert.DeserializeObject<Version>(reportJSON);
string reportJSON2 = JsonConvert.SerializeObject(report2);
//{"Major":0,"Minor":0,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1}
How to fix this? Or Which other JSON.NET library can work correctly?
The Newtonsoft.Json
library provides a set of common converters in the Newtonsoft.Json.Converters
namespace, including a VersionConverter
you can use to serialize and deserialize System.Version
.
Note that you have to use the VersionConverter
both for serialization and deserialization, though.
That's because standard serialization would generate eg.:{"Major":1,"Minor":2,"Build":3,"Revision":0,"MajorRevision":0,"MinorRevision":0}
while VersionConverter
deserialization expects a simple string as in "1.2.3"
.
So usage would be:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
string s = JsonConvert.SerializeObject(version, new VersionConverter());
Version v = JsonConvert.DeserializeObject<Version>(s, new VersionConverter());
I'm not sure what's the first version of Newtonsoft.Json
that includes that converter. Mine has it and it's 5.0.6.