2016-05-09 4 views
1

jsonファイルを読み込み、このデータをGET経由で提供する簡単なAPIを作成しました。コントローラのための私のモデルは次のようになります。GML用の不正なJson

[ 
    { 
    "Name": "testing", 
    "IP": "127.0.0.1" 
    } 
] 

そして:私は、元のJSONファイルは、次のようになりますJSON出力

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

を取得するにはWebApiConfig.csにこの行を追加

public static class ServerListHandler 
{ 
    private static readonly string _serverListPath; 
    private static FileSystemWatcher _serverListWatcher; 
    private static string _servers; 

    public static string Servers 
    { 
     get 
     { 
      if(_serverListWatcher == null && File.Exists(_serverListPath)) 
      { 
       InitializeFileWatcher(); 
       ReadData(); 
      } 

      return _servers; 
     } 

     private set 
     { 
      _servers = value; 
     } 
    } 

    static ServerListHandler() 
    { 
     _serverListPath = Properties.Settings.Default.ServerListPath; 

     if(!File.Exists(_serverListPath)) 
     { 
      Debug.WriteLine("Could not find config with path: " + _serverListPath); 
     } 
     else 
     { 
      ReadData(); 
      InitializeFileWatcher(); 
     } 
    } 

    private static void InitializeFileWatcher() 
    { 
     _serverListWatcher = new FileSystemWatcher(Path.GetDirectoryName(_serverListPath)); 
     _serverListWatcher.EnableRaisingEvents = true; 

     _serverListWatcher.Deleted += OnServerListChanged; 
     _serverListWatcher.Changed += OnServerListChanged; 
     _serverListWatcher.Created += OnServerListChanged; 
     _serverListWatcher.Renamed += OnServerListChanged; 
    } 

    private static void OnServerListChanged(object sender, FileSystemEventArgs e) 
    { 
     ReadData(); 
    } 

    private static void ReadData() 
    { 
     try 
     { 
      string content = File.ReadAllText(_serverListPath); 
      Servers = content; 
     } 
     catch(Exception ex) 
     { 
      Debug.WriteLine("Could not read server file: " + ex); 
     }    
    } 
} 

GETの結果は次のとおりです。

"[\r\n {\r\n \"Name\": \"testing\",\r\n \"IP\": \"127.0.0.1\"\r\n }\r\n]\r\n" 

もちろん、結果はJson.NETでは解析できません。 私の質問は、jsonの文字列を手動で解析する必要があるかどうか、または適切なjson出力を有効にするために何かを有効/チェックするのを忘れた場合です。

編集

要求され、これが私のコントローラ

public class ServersController : ApiController 
{ 
    public HttpResponseMessage GetAllServers() 
    { 
     if(ServerListHandler.Servers == null) 
      return Request.CreateResponse(HttpStatusCode.NoContent); 

     return Request.CreateResponse(HttpStatusCode.OK, ServerListHandler.Servers); 
    } 
} 
+0

どのようにJSONを見ていますか?デバッガでファイルに出力しますか? – CathalMF

+0

また、実際にAPIから結果を返すコードも表示します。 – CathalMF

+0

結果またはオリジナルを意味しますか?元のファイルはWebサービスディレクトリにあり、結果はWebブラウザから取得されます(またはWebアプリケーションをデバッグすることで取得できます。同じ出力です) – chris579

答えて

2

あるのでここでの問題は、Web APIは、それはあなたがそれを与える何かをシリアル化する責任があることをデフォルトで想定しているということです。ほとんどの使用例では、これはまさにあなたが望むものです。しかし、コンテンツがの場合、すでに JSONである場合、Web APIはそれを知る方法がありません。幸いなことに、文字列を再直列化し、余分な引用符とバックスラッシュをプロセスに追加します。

JSON文字列をそのまま返すには、(Web APIを作成するのではなく)明示的にレスポンスコンテンツオブジェクトを作成し、下流のクライアントが引き続きJSONとして解釈するようにメディアタイプを設定する必要があります平文よりも)。ここでは修正されたコントローラのメソッドは次のとおりです。コメントで@CathalMFによって提案されたよう

public HttpResponseMessage GetAllServers() 
{ 
    if(ServerListHandler.Servers == null) 
     return Request.CreateResponse(HttpStatusCode.NoContent); 

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK); 
    response.Content = new StringContent(ServerListHandler.Servers, Encoding.UTF8, "application/json"); 
    return response; 
} 

別の可能性のある(しかし、あまり効率的な)ソリューションは、お使いのコントローラのメソッドからそのオブジェクトを返し、その後、オブジェクトへのあなたのJSONをデシリアライズすることです。 Web APIは、レスポンスを作成するときに、オブジェクトをJSONに再度シリアル化し直します。

関連する問題