くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

JSON

.net MVC WebApi のContent-Type

.net MVCでWebApi作ってたんですが、なんだか戻りがXMLになってしまう。Jsonで返したい。

とりあえず、Chromeで取るとデフォでXMLになるっぽい?デフォでJsonにしたい。

stackoverflowに同じ質問あった。さすが。。。

回答は色々あるけど、何となく今は↓が一番良さげ?デフォを変えるなら。

using System.Net.Http.Formatting;//RequestHeaderMapping用

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        //デフォルトのフォーマットを変える↓
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new RequestHeaderMapping("Accept",
                          "text/html",
                          StringComparison.InvariantCultureIgnoreCase,
                          true,
                          "application/json"));
    }
}

WebApiConfigのRegisterの中で↑を追記。

あと、ちょっと違うけど、URLの指定で最後に「~~.json」とか「~~.xml」って指定させて、フォーマットを変える方法。RedmineのAPIはこれ形式すな。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API ルート
        config.MapHttpAttributeRoutes();
        config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
        config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "application/xml");
        
        //ルートの設定で{ext}が必要
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}.{ext}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

ただ、最初のデフォルト強制する奴つけてると効かなくナリ。

あと、↓の感じでURLは最後の「/」付けないと効かなかったりする。ちょっとハマッた。Routeの設定ちゃんとやればいけるっぽいの。

/api/controller/action.json/

ついでに、Routeの設定ってみんなどうしてるんでしょ。デフォのままだと、Controllerのみだから、GetとかPostしか作れないよね?

Controller増やせばいいんだけど、ファイルいっぱいできるからあまし好きじゃない。なので、action入れてやってたりするんですが、これってありなのかしら。イマイチ分かってない。

C# Jsonをいじる

C#でJsonいじる場合、定番のライブラリがあるけど、.netの機能のみでやる。

Jsonにするクラスの定義。

using System.Runtime.Serialization.Json;
[System.Runtime.Serialization.DataContract]
public class JsonItem
{
    [System.Runtime.Serialization.DataMember()]
    public string itemkey { get; set; }
    [System.Runtime.Serialization.DataMember()]
    public string itemval { get; set; }
}

書き込み

DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List));
MemoryStream outms = new MemoryStream();
dcs.WriteObject(outms, newList);
outms.Position = 0;
StreamReader sr = new StreamReader(outms);
string jsonStr= sr.ReadToEnd();

読み込み

DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List));
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonobject_string));
List readObj = (List)dcs.ReadObject(ms);

ちょっと試したいことが色々あったんだけど、また今度。

問合せ