2017-05-30 19 views
3

一些JSON對象我有以下DTO的字符串:返回其含有來自ServiceStack

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

    public String Info { get; set; } 
} 

信息元素包含一些序列化JSON對象其可以具有多種不同的類型。 在我的服務功能,我使用返回此DTO return x.ConvertTo<MyDTO>()

我的問題是,是,由於ServiceStack並不知道信息持有JSON,信息的特殊字符(引號)轉義。

所以我得到

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

從服務,但我想獲得實際上是

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

有一些方法,來告訴ServiceStack是信息持有JSON數據和從而防止它逃離字符串,而是直接將JSON值插入到響應中?

P.S .:我的問題不是that question的重複,它涉及強制將服務的默認DTO編碼強制爲JSON,而我的問題涉及如何針對某些類型進行JSON編碼。

+0

的可能的複製[ServiceStack默認格式(https://stackoverflow.com/questions/10317225/servicestack-default-format) –

+0

@PranavPatel我的問題是不是重複那個問題。它關心的是強制將服務的默認DTO編碼強制爲JSON,而我的問題則處理如何針對某些類型進行JSON編碼。 – mat

+0

也許這有幫助嗎? ►https://stackoverflow.com/questions/4729811/json-net-unexpected-characters-when-serializing-my-entities-entity-framew – Nope

回答

2

使用成分,你可以回到它被序列化之前解釋的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; } 
} 

這種方式在信息的JSON值可以被歸一化的Info財產。

例如

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\"]"} 

其中as

new MyDTO<dynamic>(dto); 

會產生

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

這不起作用。 ServiceStack不能從服務返回動態接口。 – mat

+1

玩弄其他返回類型。這只是一個可能的例子。我通過一些單元測試來運行它,它就像我說的那樣序列化。 – Nkosi

+0

@mat在字符串中返回JSON總是作爲JSON字符串轉義,而不管它是否包含有效的JSON。這個將其反序列化爲泛型類型的答案是正確的,儘管您不應該在DTO中放置任何邏輯(我傾向於使用擴展方法)。另一種選擇是返回一個'object',儘管[應該非常不鼓勵](https://stackoverflow.com/a/10759250/85785)。 – mythz