上下文:我需要传递一个包含大量属性/字段的对象(从中间层到UI层).在这个属性列表中,一个是Version类型,它没有从JSON字符串格式正确反序列化.我在XML上选择了JSON格式,因为字符串的JSON序列化将返回短字符串结果.
问题:System.Version没有正确反序列化.我尝试了两种不同的.NET库.以下是每个代码段:
使用ServiceStack .NET库的代码片段1 :
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}
Run Code Online (Sandbox Code Playgroud)
Code Snippet 2使用Newtonsoft .NET库但结果相同:
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}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?或者哪个其他JSON.NET库可以正常工作?
关于JSON反序列化有很多问题,但是很多问题似乎都适用于MVC 1或MVC 2.我似乎没有找到一个特别适合MVC 3的令人满意的答案.
我有一个具有不可变属性的对象,没有默认构造函数,我想在ASP.NET MVC 3应用程序中反序列化.这是一个简化版本:
public class EmailAddress
{
public EmailAddress(string nameAndEmailAddress)
{
Name = parseNameFromNameAndAddress(nameAndEmailAddress);
Address = parseAddressFromNameAndAddress(nameAndEmailAddress);
}
public EmailAddress(string name, string address)
{
Guard.Against<FormatException>(!isNameValid(name), "Value is invalid for EmailAddress.Name: [{0}]", name);
Guard.Against<FormatException>(!isAddressValid(address), "Value is invalid for EmailAddress.Address: [{0}]", address);
Name = name;
Address = address;
}
public string Address { get; private set; }
public string Name { get; private set; }
// Other stuff
}
Run Code Online (Sandbox Code Playgroud)
示例控制器操作可能是:
[HttpPost]
public ActionResult ShowSomething(EmailAddress emailAddress)
{
return View(emailAddress) …Run Code Online (Sandbox Code Playgroud)