【问题标题】:Returning a string which contains some JSON object from ServiceStack从 ServiceStack 返回一个包含一些 JSON 对象的字符串
【发布时间】:2017-05-30 09:15:48
【问题描述】:

我有以下 DTO:

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

    public String Info { get; set; }
}

Info 元素包含一些可以是多种不同类型的序列化 JSON 对象。 在我的服务函数中,我使用return x.ConvertTo<MyDTO>()返回这个 DTO

我的问题是,由于 ServiceStack 不知道 Info 包含 JSON,因此 Info 的特殊字符(引号)被转义了。

所以我明白了

{"Id":15,"Info":"[\"Test1\",\"Test2\",\"Test3\"]"}

来自服务,但我想得到的其实是

{"Id":15,"Info":["Test1","Test2","Test3"]}

有什么方法可以告诉 ServiceStack Info 包含 JSON 数据,从而防止它转义字符串,而是将 JSON 值直接插入响应中?

P.S.:我的问题不是 that question 的重复,它涉及将服务的默认 DTO 编码强制为 JSON,而我的问题涉及 JSON 编码对于某些类型是如何发生的。

【问题讨论】:

  • @PranavPatel 我的问题不是那个问题的重复。它涉及将服务的默认 DTO 编码强制为 JSON,而我的问题是处理某些类型的 JSON 编码是如何发生的。
  • 也许这有帮助? ►stackoverflow.com/questions/4729811/…
  • @mat 预期的不是有效的 JSON。这不是有效的 JSON {"Id":15,"Info":"{["Test1","Test2","Test3"]}"}。你实际得到的是正确的,因为 Info 是一个字符串,因此它被转义了。
  • @Nkosi 那行不通。信息基本上可以从任何类型编码。值的解码和解释仅在前端完成。

标签: c# json servicestack


【解决方案1】:

使用组合可以解释MyDTOInfo 属性

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

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

例如

var dto = x.ConvertTo<MyDTO>();
return new MyDTO<dynamic>(dto);

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

var dto = new MyDTO {
    Id = 15,
    Info = "[\"Test1\",\"Test2\",\"Test3\"]"
}

会产生

{"Id":15,"Info":"[\"Test1\",\"Test2\",\"Test3\"]"}

在哪里

new MyDTO<dynamic>(dto);

会产生

{"Id":15,"Info":["Test1","Test2","Test3"]}

【讨论】:

  • 那行不通。 ServiceStack 无法从服务返回动态接口。
  • 玩转其他返回类型。这只是作为一个例子,它是可能的。我通过一些单元测试运行它,并像我说的那样序列化。
  • @mat 在字符串中返回 JSON 总是作为 JSON 字符串转义,不管它是否包含有效的 JSON。这个将其反序列化为泛型类型的答案是正确的,尽管您不应该在 DTO 中放置任何逻辑(我更喜欢使用扩展方法)。另一种选择是返回object,尽管should be heavily discouraged
【解决方案2】:

我和我的同事遇到了类似的问题,with the help of Demis Bellot 我们能够找到一个解决方案,如果将其转换为 OP 中的代码,它将如下所示:

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

    public Dictionary<string, object> Info { get; set; }
}

当我们填充 DTO 时,我们像这样使用JSON.parse

var json = (Dictionary<string, object>)JSON.parse(rawJsonString);
return new MyDTO
{
    Id = 42,
    Info = json
};

我们的原始 JSON 字符串是一个 JSON 对象。在 OP 中,看起来原始 JSON 字符串可能是一个数组,在这种情况下,it looks as though 适当的属性类型可能是 List&lt;object&gt;

JSON.parse 可以在ServiceStack.Common 中找到。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多