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



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

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; }
}

我在Swagger中得到的是:

{
"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
}

Content是一个JSON字符串。我不能创建特定类型的类并将JSON反序列化为该类,因为字符串的结构可能会发生变化。

我如何修改对象和类型的内容,使内容看起来像一个子对象在JSON返回的控制器?

您需要返回一些将被正确序列化的对象。例如,您可以使用c# 6中引入的JsonNodeAPI:

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 }""");
}

另一种选择是使用自定义转换器创建一个特殊的包装器,它将按原样编写字符串(尽管在这种情况下,您要么需要在转换器中验证字符串,要么可能会得到无效的JSON)。

最新更新