如何在.NET 6 WebApi控制器中返回JSON字符串作为子对象?

omqzjyyz  于 2023-04-08  发布在  .NET
关注(0)|答案(1)|浏览(295)

我有下面的数据结构,我想从控制器返回结果:

public class DataModel
{
    public string Id { get; private set; }

    public string Name { get; private set; }

    public string Description { get; private set; }

    public string ProjectId { get; private set; }

    public string Content { get; private set; }

    public DateTime CreationTime { get; private set; }

    public DateTime? LastModificationTime { get; private set; }
}

我在斯瓦格得到的是:

{
  "id": "642af19d6d5bb761f5a62cc0",
  "name": "Test submission 8",
  "description": "test description",
  "projectId": "1a1b1c",
  "content": "{ \"Name\" : \"Test 1\", \"Id\" : \"id1\", \"Value\" : 1 }",
  "creationTime": "2023-04-03T15:32:45Z",
  "lastModificationTime": null
}

我想得到的是:

{
  "id": "642af19d6d5bb761f5a62cc0",
  "name": "Test submission 8",
  "description": "test description",
  "projectId": "1a1b1c",
  "content": {
    "Name": "Test 1",
    "Id": "id1",
    "Value": 1
  },
  "creationTime": "2023-04-03T15:32:45Z",
  "lastModificationTime": null
}

内容是一个JSON字符串。我不能创建一个特定类型的类并将JSON反序列化为那个类,因为字符串的结构可以变化。
如何修改Content的对象和类型,使Content看起来像控制器返回的JSON中的子对象?

tzdcorbm

tzdcorbm1#

你需要返回一些能够被正确序列化的对象。例如,你可以使用C# 6中引入的JsonNode API:

public class DataModel
{
    // ....

    // sample value and public setter for testing purposes:
    public JsonNode Content { get; set; } = JsonNode.Parse("""{ "Name" : "Test 1", "Id" : "id1", "Value" : 1 }""");

}

另一种选择是使用custom converter创建一个特殊的 Package 器,它将按原样写入字符串(尽管在这种情况下,您需要在转换器中验证字符串,或者您可能会得到无效的JSON)。

相关问题