Question

mars12 on Wed, 14 Mar 2012 08:07:04


WCF(.NET Framework4.0)でJSONを返すメソッドを作ろうと思っています。

コード1の場合はオブジェクトを戻り値にしていて、正しくJSONの形式で返ってきていますが、
コード2の場合は、当然なのでしょうけど、戻り値のJSON文字列がエスケープされてクオートもされています。
これを結果1と同じにする方法はありますでしょうか。
このサンプルは配列でやっていますが、とりあえずDataTableをシリアライズしたものを返したいと思っていますが
JSONの文字列を作る方法まではわかっていますので、それのContent-Typeが"application/json"で
JSON文字列がそのまま返ってくればよいのかなとは思っています。

試したこととしては
・コード2の戻り値をDataTableにしてみる
    → XMLになったDataTableが文字列で返ってくる
・コード2の "ResponseFormat = WebMessageFormat.Json" をはずしてみる
    → 結果のJSON文字列がXMLで<string></string>で囲まれて返ってくる
です。

一般的な方法 または いい方法ありますでしょうか。

// コード1
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetTestData/{param}")]
    string[] GetTestData(string param);
}

public class TestService : IService1
{
    public string[] GetTestData(string param)
    {
        string[] arr = new string[]{"aaa", "日本語"};
        return arr; // オブジェクトをそのまま返す
    }
}

// 結果1(期待しているもの)
[
    "aaa",
    "日本語"
]

// コード2
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetTestData/{param}")]
    string GetTestData(string param);
}

public class TestService : IService1
{
    public string GetTestData(string param)
    {
        string[] arr = new string[]{"aaa", "日本語"};
        var s = new JavaScriptSerializer().Serialize(arr); // ここでJSON文字列にする
        return s;
    }
}

// 結果2(エスケープされている)
"[\"aaa\",\"日本語\"]"


Sponsored



Replies

cbqb22 on Sun, 11 Nov 2012 13:05:48


こんばんは、cbqb22と申します。

試す時間がなくて申し訳ございませんが、検索して参考になるかもと思いまして、URLの紹介だけ。

http://d.hatena.ne.jp/okazuki/20110109/1294586423

参考になれば。。。


cbqb22 on Sun, 11 Nov 2012 13:17:56


あまりにも回答が丸投げな感じなので、少し調べてみました。

JavaScriptSerializer().Serialize(arr);ですが、エスケープシーケンスが存在する場合は必ず\がつく様ですね。

なので、自前でシリアライザーを作ってしまった方が早そうな気がします。

http://www.takeash.net/wiki/?CSharp%2FDictionaryEx