我和我的团队在C#中使用JSON.NET反序列化来解决这个奇怪的行为.
我们有一个简单的ViewModel IOrderedEnumerable<long>:
public class TestClass
{
public IOrderedEnumerable<long> orderedDatas { get; set; }
public string Name { get; set; }
public TestClass(string name)
{
this.Name = name;
this.orderedDatas = new List<long>().OrderBy(p => p);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我们只想在API控制器中POST/PUT这个viewmodel
[HttpPost]
public IHttpActionResult Post([FromBody]TestClass test)
{
return Ok(test);
}
Run Code Online (Sandbox Code Playgroud)
使用看起来像这样的json调用此API:
{
Name: "tiit",
"orderedDatas": [
2,
3,
4
],
}
Run Code Online (Sandbox Code Playgroud)
通过这个调用,我们看到没有调用构造函数(可以解释为它不是默认构造函数).但奇怪的是,如果我们将集合的类型更改为IEnumerable或IList,则正确调用构造函数.
如果我们将构造函数更改TestClass为默认构造函数:
public class TestClass
{
public IOrderedEnumerable<long> orderedDatas { get; set; }
public string Name …Run Code Online (Sandbox Code Playgroud) 我有一个带有Parent属性的对象,该对象引用了另一个相同类型的对象:
[JsonObject(IsReference = true)]
class Group
{
public string Name { get; set; }
public Group(string name)
{
Name = name;
Children = new List<Group>();
}
public IList<Group> Children { get; set; }
public Group Parent { get; set; }
public void AddChild(Group child)
{
child.Parent = this;
Children.Add(child);
}
}
Run Code Online (Sandbox Code Playgroud)
序列化工作正常,并导致json如下所示:
{
"$id": "1",
"Name": "Parent",
"Children": [
{
"$id": "2",
"Name": "Child",
"Children": [],
"Parent": {
"$ref": "1"
}
}
],
"Parent": null
}
Run Code Online (Sandbox Code Playgroud)
但是反序列化是行不通的。Parent属性返回null。
测试看起来像这样:
[Test]
public …Run Code Online (Sandbox Code Playgroud)