C〓〓webアプリ返却タイプはjsonに設定する2つの方法です。


ウェブアプリでappiインターフェースを書く時にデフォルトで戻ってくるのは、あなたのオブジェクトをプログレッシブしてXML形式で返しますが、どうやってJsonに戻すことができますか?二つの方法を紹介します。
方法一:(配置法の変更)
Global.asaxファイルを見つけました。Application_Start()メソッドに一言を追加します。
 
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
変更後:
 
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// api json
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}
このように戻ってきた結果はすべてjsonタイプですが、悪いところがあります。戻ってきた結果はStringタイプです。123のように、戻ってきたjsonは123になります。
解決策は、カスタムリターンタイプ(リターンタイプは、HttpResonseMessage)です。
 
public HttpResponseMessage PostUserName(User user)
{
String userName = user.userName;
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(userName,Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
方法二:(万金油法)
方法の中でまた配置を変えて、またStringタイプのjsonに返すことを処理して、とても面倒で、むしろウェブアプリの中の自動的な序列化の対象を使わないでください、自分で順番に並べて後で帰ります。
 
public HttpResponseMessage PostUser(User user)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
string str = serializer.Serialize(user);
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
二つ目は私のオススメの方法です。各インターフェースでそのコードを繰り返し書かないために、一つの方法としてカプセル化して使うと便利です。
 
public static HttpResponseMessage toJson(Object obj)
{
String str;
if (obj is String ||obj is Char)
{
str = obj.ToString();
}
else
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
str = serializer.Serialize(obj);
}
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
方法3:(最も面倒な方法)
方法は一番簡単ですが、殺傷力が大きいので、全部の戻りのXmlフォーマットは全部殺されます。方法3はappiインターフェースの中でxmlだけ殺してJsonに戻ります。
先に処理したクラスを書きます。
 
public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;

public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}

public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}
アプリを見つけましたStartのWebAppliConfig.csファイルを開いて、Registerを見つけます。
以下のコードを追加します。
 
var jsonFormatter = new JsonMediaTypeFormatter();
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
追加後のコードは以下の通りです。
 
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var jsonFormatter = new JsonMediaTypeFormatter();
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
}
方法三戻りの結果がStringタイプであれば、123のように戻りJsonは「123」になり、解決方法は同じである。
実はwebアプリは自動的に戻ったオブジェクトをxmlとjsonの両方のフォーマットに変えて並存しています。一つの方法は方法3とxmlを殺して戻ってきます。二つの方法はカスタムリターンです。
PS:Json操作については、ここでいくつかの実用的なjsonオンラインツールを紹介します。
オンラインJSONコード検査、検査、美化、フォーマットツール:
http://tools.jb51.net/code/json
JSONオンラインフォーマットツール:
http://tools.jb51.net/code/jsonformat
オンラインXML/JSON相互変換ツール:
http://tools.jb51.net/code/xmljson
jsonコードはオンラインフォーマット/美化/圧縮/編集/変換ツール:
http://tools.jb51.net/code/jsoncodeformat
オンラインJson圧縮/変換ツール:
http://tools.jb51.net/code/json_yasuo_トラッキング
C言語スタイル/HTML/CSS/Jsonコードフォーマット美化ツール:
http://tools.jb51.net/code/ccode_同前css_Json