2016-08-14 6 views
11

私はAzure Functionsで遊んでいます。しかし、私はかなりシンプルなものに困惑しているように感じます。私は基本的なJSONを返す方法を理解しようとしています。私はいくつかのJSONを作成して、それを私の要求に戻す方法がわかりません。Azure関数からJSONを返す方法

いつか、私はオブジェクトを作成し、そのプロパティを設定し、それをシリアル化します。だから、私はこの道を開始しました:

#r "Newtonsoft.Json" 

using System.Net; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    log.Info($"Running Function");  
    try {  
     log.Info($"Function ran"); 

     var myJSON = GetJson(); 

     // I want myJSON to look like: 
     // { 
     // firstName:'John', 
     // lastName: 'Doe', 
     // orders: [ 
     //  { id:1, description:'...' }, 
     //  ... 
     // ] 
     // } 
     return ?; 
    } catch (Exception ex) { 
     // TODO: Return/log exception 
     return null; 
    } 
} 

public static ? GetJson() 
{ 
    var person = new Person(); 
    person.FirstName = "John"; 
    person.LastName = "Doe"; 

    person.Orders = new List<Order>(); 
    person.Orders.Add(new Order() { Id=1, Description="..." }); 

    ? 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

はしかし、私はnow.I、私はすべてがアクション

あるASP.NET MVCでJSONを返すために使用していシリアライズと戻りプロセスに完全に立ち往生推測しています
+0

あなたはいくつかの答えを持っています。コードは以下のように与えられる

{"FirstName":"John","LastName":"Doe","Orders":[{"Id":1,"Description":"..."}]} 

:ここ

はとChromeで結果完全に動作するサンプルです。私は最近の文書に基づいて最新の回答を提供しました。 –

答えて

4

JSONはかなり簡単です、Newtonsoft.Jsonライブラリはspecial caseです。あなたは、スクリプトファイルの先頭にこれを追加することで、それを含めることができます。

#r "Newtonsoft.Json" 

using Newtonsoft.Json; 

次に、あなたの関数は次のようになります。

public static string GetJson() 
{ 
    var person = new Person(); 
    person.FirstName = "John"; 
    person.LastName = "Doe"; 

    person.Orders = new List<Order>(); 
    person.Orders.Add(new Order() { Id=1, Description="..." }); 

    return JsonConvert.SerializeObject(person); 
} 
+1

しかし、私は 'Run'メソッドからそれを返すのですか? 'Run'メソッドは文字列ではない' HttpResponseMessage'を返します。しかし、私は生の文字列を返すことを望んでいません。むしろJSONを返したいと思っています。 –

+0

1つの方法は、手動でHttpResponseMessageを手動で作成することです。それをJsonとStringContentとして設定します。 – juunas

+0

ここに例があります:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results – juunas

2

あなたにメソッドシグネチャを変更することができます。

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log) 

とJSONデータを返すことができます。

+2

ちょうどAzureポータルで試したところ、JSONも返されました: 'return req.CreateResponse(HttpStatusCode.OK、result、" application/json ");'、メソッドシグネチャで遊ぶことなし –

0

私は同様の問題を抱えていましたが、これは答えのない最もポピュラーな投稿のようでした。次のノードがどのノードで動作するかを把握した後、あなたが何をしているのかを正確に伝えます。他の例でもJSONが返される文字列表現が返されます。

System.Textを使用して宣言することを忘れないでください。また、JuunasレスポンスごとにGetJson関数に加えて、

return JsonConvert.SerializeObject(person); 

を追加します。ここで

13

return new HttpResponseMessage(HttpStatusCode.OK) 
 
     { 
 
      Content = new StringContent(GetJson(), Encoding.UTF8, "application/json") 
 
     };
は、XMLの代わりに適切な形式のJSONオブジェクトを返すAzureの機能の完全な例です:ブラウザでエンドポイントに

#r "Newtonsoft.Json" 
using System.Net; 
using Newtonsoft.Json; 
using System.Text; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    var myObj = new {name = "thomas", location = "Denver"}; 
    var jsonToReturn = JsonConvert.SerializeObject(myObj); 

    return new HttpResponseMessage(HttpStatusCode.OK) { 
     Content = new StringContent(jsonToReturn, Encoding.UTF8, "application/json") 
    }; 
} 

移動し、あなたが表示されます。

{ 
    "name": "thomas", 
    "location": "Denver" 
} 
4

req

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 

から及び組立System.Web.Http

return req.CreateResponse(HttpStatusCode.OK, json, "application/json"); 

または他のオーバーロードのいずれかを使用して応答を作成します。 docs.microsoft.com

+1

私は次のように使います: '' req.CreateResponse(HttpStatusCode.OK、json、JsonMediaTypeFormatter.DefaultMediaType); '。私はそれが 'application/json'文字列よりも安全だと思います。 – DoronG

1

詳細情報、これは明示的にNewtonsoft.JsonPersonをシリアル化する必要がなく、「アプリケーション/ jsonの」メディアタイプを使用することによってだけで実現することができるように見えます。あなたの質問への答えとして1をマークしてください -

[FunctionName("StackOverflowReturnJson")] 
    public static HttpResponseMessage Run([HttpTrigger("get", "post", Route = "StackOverflowReturnJson")]HttpRequestMessage req, TraceWriter log) 
    { 
     log.Info($"Running Function"); 
     try 
     { 
      log.Info($"Function ran"); 

      var myJSON = GetJson(); // Note: this actually returns an instance of 'Person' 

      // I want myJSON to look like: 
      // { 
      // firstName:'John', 
      // lastName: 'Doe', 
      // orders: [ 
      //  { id:1, description:'...' }, 
      //  ... 
      // ] 
      // } 
      var response = req.CreateResponse(HttpStatusCode.OK, myJSON, JsonMediaTypeFormatter.DefaultMediaType); // DefaultMediaType = "application/json" does the 'trick' 
      return response; 
     } 
     catch (Exception ex) 
     { 
      // TODO: Return/log exception 
      return null; 
     } 
    } 

    public static Person GetJson() 
    { 
     var person = new Person(); 
     person.FirstName = "John"; 
     person.LastName = "Doe"; 

     person.Orders = new List<Order>(); 
     person.Orders.Add(new Order() { Id = 1, Description = "..." }); 

     return person; 
    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public List<Order> Orders { get; set; } 
    } 

    public class Order 
    { 
     public int Id { get; set; } 
     public string Description { get; set; } 
    } 
関連する問題