10413


.NET Framework4.5で作成したWebサービスアプリケーションでJSONを返し、  
iPadからSwiftのAlamofire、SwiftyJSONで取得したいと思っています。

オブジェクトのシリアライズにはJavaScriptSerializerを使っています。

[code]

    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Salary { get; set; }
    }
    
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class WebService
    {
        [WebMethod]
        [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
        public string GetEmployessJSON()
        {
            Employee[] emps = new Employee[] {  
                new Employee()  
                {  
                    Id=101,  
                    Name="Nitin",  
                    Salary=10000  
                },  
                new Employee()  
                {  
                    Id=102,  
                    Name="Dinesh",  
                    Salary=100000  
                }  
            };
    
            var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            string json = serializer.Serialize(emps);
            return json;
        }
    }
    
[/code]

■web.config

[code]

    <configuration>
    <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    
    <!-- Getを有効にする -->
    <webServices>
    <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
    </protocols>      
    </webServices>
    </system.web>
    </configuration>
    
[/code]

ブラウザのアドレスバーにURLを直接入力してアクセスすると、

> <?xml version="1.0" encoding="UTF-8"?>  
>  <string
> xmlns="http://tempuri.org/">[{"Id":101,"Name":"Nitin","Salary":10000},{"Id":102,"Name":"Dinesh","Salary":100000}]</string>

このようにXML形式で返ってきて、中身がJsonという状態になってしまいます。  
純粋にJsonだけを返したいのですが、何か解決策はないでしょうか。


CC BY-SA 3.0
2015-05-19T09:26:23.157
10366
2015-05-20T07:08:39.883
2015-05-20T06:44:44.250
9183
9183
question
swift c# json asp.net
asmx WEBサービスでJSONを返したいがXML形式になってしまう


JSON形式でASMXを呼び出すためにはリクエストの`Content-Type`を`application/json`にする必要があります。  
またサーバー側は明示的にJSONに変換する必要は無く、戻り値の型は`Employee[]`で良いと思われます。

なおweb.configでハンドラーを弄れば`Content-
Type`を明示しなくてもJSONが既定の形式になったと思いますが、統合モードで可能かはわかりません。


CC BY-SA 3.0
2015-05-19T11:00:17.443
10373
2015-05-19T11:00:17.443
5750
10366
answer


GetEmployessJSON() はjsonとしてシリアライズした結果の文字列を返していますが、  
これをEmployeeのListをそのまま返すように変更したらどうなりますか？

[Getting Json data using jQuery and .ASMX web
services.](https://cmatskas.com/getting-json-data-using-an-asmx-web-service/
"Getting Json data using jQuery and .ASMX web services.")


CC BY-SA 3.0
2015-05-20T01:12:37.327
10394
2015-05-20T01:12:37.327
9801
10366
answer


下記のようにContentTypeを指定することで解消できました。

[code]

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class WebService : System.Web.Services.WebService
    {
        [WebMethod]
        public Employee[] GetEmployessXML()
        {
            Employee[] emps = new Employee[] {  
                new Employee()  
                {  
                    Id=101,  
                    Name="Nitin",  
                    Salary=10000  
                },  
                new Employee()  
                {  
                    Id=102,  
                    Name="Dinesh",  
                    Salary=100000  
                }  
            };
            return emps;
        }
    
    
        [WebMethod]
        [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
        public void GetEmployessJSON()
        {
            Employee[] emps = new Employee[] {  
                new Employee()  
                {  
                    Id=101,  
                    Name="Nitin",  
                    Salary=10000  
                },  
                new Employee()  
                {  
                    Id=102,  
                    Name="Dinesh",  
                    Salary=100000  
                }  
            };
    
            JavaScriptSerializer js = new JavaScriptSerializer();
            Context.Response.Clear();
            Context.Response.ContentType = "application/json";
            Context.Response.Write(js.Serialize(emps));
        }
    }
    
[/code]


CC BY-SA 3.0
2015-05-20T06:45:03.243
10412
2015-05-20T06:45:03.243
9183
10366
answer


そもそも自分でシリアライズするならWEBサービスである必要はないと思いますが  
WEBフォームで

[code]

    protected void Page_Load(object sender, EventArgs e)
    {
    
        Employee[] emps = new Employee[] {  
            new Employee()  
            {  
                Id=101,  
                Name="Nitin",  
                Salary=10000  
            },  
            new Employee()  
            {  
                Id=102,  
                Name="Dinesh",  
                Salary=100000  
            }  
        };
    
        Response.Clear();
        Response.ContentType = "application/json";
    
        var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        string json = serializer.Serialize(emps);
        Response.Write(json);
        Response.End();
    }
    
[/code]

でいけるんじゃ

WEBサービスでやるなら、すでに回答されてるようにEmployee[]を戻せばよいはずです

[code]

    public Employee[] GetEmployessJSON()
    {
        Employee[] emps = new Employee[] {  
            new Employee()  
            {  
                Id=101,  
                Name="Nitin",  
                Salary=10000  
            },  
            new Employee()  
            {  
                Id=102,  
                Name="Dinesh",  
                Salary=100000  
            }  
        };
        return emps;
    }
    
[/code]

リクエストのContent-Typeにapplication/jsonを設定する方法ですが  
ページ処理が始まってる段階で設定しても遅いです  
Glabal.asaxで

[code]

    protected void Application_BeginRequest()
    {
        if (Request.PathInfo == "/GetEmployessJSON")
        {
            Request.ContentType = "application/json";
        }
    }
    
[/code]

とかやってやればいけるはずです


CC BY-SA 3.0
2015-05-20T07:08:39.883
10413
2015-05-20T07:08:39.883
9810
10366
answer