相关疑难解决方法(0)

使用JSON.NET反编译IOrderedEnumerable <T>

我和我的团队在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)

通过这个调用,我们看到没有调用构造函数(可以解释为它不是默认构造函数).但奇怪的是,如果我们将集合的类型更改为IEnumerableIList,则正确调用构造函数.

如果我们将构造函数更改TestClass为默认构造函数:

public class TestClass
{
    public IOrderedEnumerable<long> orderedDatas { get; set; }
    public string Name …
Run Code Online (Sandbox Code Playgroud)

c# serialization json json.net json-deserialization

7
推荐指数
1
解决办法
773
查看次数

自引用属性的反序列化不起作用

我有一个带有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)

json.net

4
推荐指数
1
解决办法
1258
查看次数

标签 统计

json.net ×2

c# ×1

json ×1

json-deserialization ×1

serialization ×1