从ServiceStack返回一个包含一些JSON对象的字符串

mat*_*mat 5 c# json servicestack

我有以下DTO:

public class MyDTO
{
    public int Id { get; set; }

    public String Info { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

信息元素包含一些序列化JSON对象其可以具有多种不同的类型。在我的服务功能中,我使用return x.ConvertTo<MyDTO>()

我的问题是,是,由于ServiceStack是不知道的信息持有JSON,特殊字符(引号)信息被转义。

所以我得到

{"Id":15,"Info":"[\"Test1\",\"Test2\",\"Test3\"]"}
Run Code Online (Sandbox Code Playgroud)

从服务中获取,但实际上我想得到的是

{"Id":15,"Info":["Test1","Test2","Test3"]}
Run Code Online (Sandbox Code Playgroud)

是否可以通过某种方法告诉ServiceStack Info保留JSON数据,从而防止其转义字符串,而是将JSON值直接插入响应中?

PS:我的问题不是该问题的重复,该问题与将服务的默认DTO编码强制为JSON有关,而我的问题涉及某些类型的JSON编码如何发生。

Nko*_*osi 2

使用组合你可以解释Info的属性MyDTO

public class MyDTO<T> : MyDTO {

    public MyDTO(MyDTO dto) {
        this.Id = dto.Id;
        this.Info = JsonConvert.DeserializeObject<T>(dto.Info);
    }

    public new T Info { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样,Info 中的 JSON 值可以在返回进行序列化之前对其进行规范化。

例如

var dto = x.ConvertTo<MyDTO>();
return new MyDTO<dynamic>(dto);
Run Code Online (Sandbox Code Playgroud)

如果dto.Info是 JSON 字符串数组,则允许在 OP 中根据需要序列化该数组

var dto = new MyDTO {
    Id = 15,
    Info = "[\"Test1\",\"Test2\",\"Test3\"]"
}
Run Code Online (Sandbox Code Playgroud)

会产生

{"Id":15,"Info":"[\"Test1\",\"Test2\",\"Test3\"]"}
Run Code Online (Sandbox Code Playgroud)

然而

new MyDTO<dynamic>(dto);
Run Code Online (Sandbox Code Playgroud)

会产生

{"Id":15,"Info":["Test1","Test2","Test3"]}
Run Code Online (Sandbox Code Playgroud)