2017-05-30 6 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"]} 

いくつかの方法がありますされ、情報はJSONデータを保持していることServiceStackを伝えるためにとしたがって、それが文字列をエスケープするのを防ぎ、その代わりにJSON値をレスポンスに直接挿入しますか?

P .:私の質問は、サービスのデフォルトDTOエンコーディングを強制的にJSONに強制することに関係するthat questionの複製ではありません。私の問題は特定のタイプに対してJSONエンコーディングがどのように起こるかを扱っています。 InfoでJSON値をシリアル化するためにそれを返す前に正規化することができる方法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; } 
} 

Infoプロパティを解釈できる組成物を用いて

+0

[ServiceStackのデフォルトフォーマット](https://stackoverflow.com/questions/10317225/servicestack-default-format)の可能性のある重複 –

+0

を生成しますその質問。これは、サービスのデフォルトのDTOエンコーディングをJSONに強制することに関係しますが、私の問題は特定のタイプのJSONエンコーディングがどのように起こるかを扱っています。 – mat

+0

おそらくこれは役に立ちますか? ►https://stackoverflow.com/questions/4729811/json-net-unexpected-characters-when-serializing-my-entities-entity-framew – Nope

答えて

2

。例えば

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

について

dto.Info場合

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

OPに所望のように文字列のJSON配列は、配列をシリアル化することを可能にするたこと

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

生み出しますas

私の質問は、重複のない@PranavPatel
new MyDTO<dynamic>(dto); 

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

それは動作しません。 ServiceStackはサービスから動的インターフェイスを返すことはできません。 – mat

+1

他のリターンタイプで遊んでください。これは、それが可能であるという事例としての意味にすぎません。私はこれをいくつかの単体テストで実行し、私が言ったように連載しました。 – Nkosi

+0

@mat文字列内のJSONを返すのは、有効なJSONが含まれているかどうかにかかわらず、常にJSON文字列としてエスケープされます。この答えをジェネリック型に逆シリアル化するのは正しいですが、DTOにロジックを入れてはいけません(私は代わりに拡張メソッドを使うことを好みます)。もう一つのオプションは 'オブジェクト'を返すことですが、それは[大いに落胆するはずです](https://stackoverflow.com/a/10759250/85785)。 – mythz

関連する問題