2017-08-16 8 views
1

私はAzure関数をかなり使い慣れています。JsonをPoco Collectionに変換する/ For Eachをコーディングする方法?

jsonのコンテンツを取り出して単純なpoco/dtoオブジェクトのコレクションに変換するために、C#WebHook/Azure関数を作成しました(これが正しいと思います)。別の.csファイルで

public static class GenericWebHookCSharp 
{ 
    [FunctionName("GenericWebHookCsharpOne")] 
    public static async Task<HttpResponseMessage /* object */> Run([HttpTrigger(WebHookType = "genericJson")]HttpRequestMessage req, TraceWriter log) 
    { 
     try 
     { 

      log.Info(string.Format("C# GenericWebHookCsharpOne about to process a request. ('{0}')", DateTime.Now.ToLongTimeString())); 

      //IUnityContainer container = new UnityContainer(); 
      //container.RegisterType<IJsonToPersonRequestWrapperConverter, JsonToPersonRequestWrapperConverter>(); 
      //IJsonToPersonRequestWrapperConverter jsonConvtr = container.Resolve<IJsonToPersonRequestWrapperConverter>(); 
      //ICollection<Person> emps = await jsonConvtr.ConvertHttpRequestMessageToPersonCollection(req); 

      /* above commented code is my "real" code where I take the INPUT request-body-as-json and convert it into a ICollection of Person(s) */ 
      /* below code, I just fake-creating some persons */ 
      string jsonContent = await req.Content.ReadAsStringAsync(); 
      ICollection<Person> persons = new List<Person>(); 
      for(int i = 0; i< 10; i++) 
      { 
       persons.Add(new Person() { PersonUuid = Guid.NewGuid(), LastName = "LN" + i.ToString(), FirstName = "FN" + i.ToString(), BirthDate = DateTimeOffset.Now.AddYears(-1 * (20 + i))}); 
      } 

      string serializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(persons); 

      log.Info(string.Format("C# GenericWebHookCsharpOne finished a request. ('{0}')", DateTime.Now.ToLongTimeString())); 

      return req.CreateResponse(HttpStatusCode.OK , serializedJson); 

     } 
     catch (Exception ex) 
     { 
      string errorMsg = ex.Message;// ExceptionHelper.GenerateFullFlatMessage(ex); 
      log.Error(errorMsg); 
      return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg); 
     } 
    } 
} 

私は、Visual Studioでデバッグする場合は、それが正常に動作します

public class Person 
{ 

    public Guid PersonUuid { get; set; } 

    public string LastName { get; set; } 

    public string FirstName { get; set; } 

    public DateTimeOffset? BirthDate { get; set; } 
} 

を提出。

enter image description here

の下に見られるように、だから私は、だから私はステップ「ごとに」新しいステップを追加したい私のロジックのアプリケーション上のステップとしてこれを追加しました。ここに私が今取得するものがあります:(下の画像)。私が見るすべては、最初のトリガと「変換」ウェブフック機能(私は上記の持っている)から、「身体」........私は「人」を取得するにはどうすればよい

enter image description here

(ありますだから私はそれぞれの人のために)コレクションを表示し、ロジックアプリケーションの次のステップのために利用できるようにすることができますか?/APPEND

EDIT:

エンドゲームは私の人(複数可)の「それぞれ」のためのサービス・バス・メッセージをプッシュすることです。

enter image description here

要求されたようスティーブンヴァンEyckenたちは、ロジック・アプリケーションでのJSON fucntionで配列に文字列を解析できることを述べたように、ここでは「人のJSONは」.....

[{ 
    "PersonUuid": "7ec8cc4d-831c-4c89-8516-47424ee2658d", 
    "LastName": "LN0", 
    "FirstName": "FN0", 
    "BirthDate": "1997-08-17T09:46:16.9839382-04:00" 
}, 
{ 
    "PersonUuid": "275264bc-5a86-476d-a189-512afa1e3ce4", 
    "LastName": "LN1", 
    "FirstName": "FN1", 
    "BirthDate": "1996-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "e522b827-2d2e-465d-a30a-c4b619d2e8e4", 
    "LastName": "LN2", 
    "FirstName": "FN2", 
    "BirthDate": "1995-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "f16bce36-3491-4519-bc82-580939f61b2e", 
    "LastName": "LN3", 
    "FirstName": "FN3", 
    "BirthDate": "1994-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "42456057-39ef-45aa-bd7c-ad6a8fa74fd1", 
    "LastName": "LN4", 
    "FirstName": "FN4", 
    "BirthDate": "1993-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "14088a6e-3c44-4cb0-927d-19f5eda279c4", 
    "LastName": "LN5", 
    "FirstName": "FN5", 
    "BirthDate": "1992-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "332a5cde-3cd1-467a-9dfc-2b187d6ae32e", 
    "LastName": "LN6", 
    "FirstName": "FN6", 
    "BirthDate": "1991-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "6debe134-19e6-4b16-a91d-05ded511eff6", 
    "LastName": "LN7", 
    "FirstName": "FN7", 
    "BirthDate": "1990-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "e61ef8a1-09d3-4c5b-b948-df8e0858cd29", 
    "LastName": "LN8", 
    "FirstName": "FN8", 
    "BirthDate": "1989-08-17T09:46:16.9844385-04:00" 
}, 
{ 
    "PersonUuid": "e9b27632-d3a4-4fe8-8745-04edfa8854f7", 
    "LastName": "LN9", 
    "FirstName": "FN9", 
    "BirthDate": "1988-08-17T09:46:16.9844385-04:00" 
}] 
+2

GenericWebHookCsharpOne関数が返すボディのサンプルを追加できますか?コードを見ると、これには「Persons」の配列が含まれます。だからあなたの関数のBodyを追加すれば十分です。 foreachの前に "Parse JSON"アクションを追加することもできます。このアクションでは、jsonスキーマを定義(またはサンプルを使用して生成)することができます。それぞれのfor-each式で、 "Parse JSON"アクションの出力を使用することができます。 –

+0

「Person」-Jsonが追加されました。また、Parse-JSONアクションについても見ていきます。どうも。 – granadaCoder

答えて

3

私は忘れる前に、これを書かなければなりません。うわー、どんな乗り物。

最初にWebHookのC#コード。 "anonymousPersonWrapper"コードに注意してください。

{ 
    "personWrapper": [{ 
     "PersonUuid": "31fb318d-a9bf-4c2f-ad16-0810ddd73746", 
     "LastName": "LN0", 
     "FirstName": "FN0", 
     "BirthDate": "1997-08-17T15:10:08.9633612-04:00" 
    }, 
    { 
     "PersonUuid": "73fdacc7-e1e8-48ff-b161-1bd8b5f4aec1", 
     "LastName": "LN1", 
     "FirstName": "FN1", 
     "BirthDate": "1996-08-17T15:10:08.9633612-04:00" 
    }, 
    { 
     "PersonUuid": "d18b4324-2d3e-41ca-9525-fe769af89e9c", 
     "LastName": "LN2", 
     "FirstName": "FN2", 
     "BirthDate": "1995-08-17T15:10:08.9633612-04:00" 
    }] 
} 

[OK]を:;

public static class GenericWebHookCSharp 
{ 
    [FunctionName("GenericWebHookCsharpOne")] 
    public static async Task<HttpResponseMessage /* object */> Run([HttpTrigger(WebHookType = "genericJson")]HttpRequestMessage req, TraceWriter log) 
    { 
     try 
     { 

      log.Info(string.Format("C# GenericWebHookCsharpOne about to process a request. ('{0}')", DateTime.Now.ToLongTimeString())); 

      ///////* below code, I just fake-creating some persons */ 
      string jsonContent = await req.Content.ReadAsStringAsync(); 
      ICollection<Person> persons = new List<Person>(); 
      for (int i = 0; i < 3; i++) 
      { 
       persons.Add(new Person() { PersonUuid = Guid.NewGuid(), LastName = "LN" + i.ToString(), FirstName = "FN" + i.ToString(), BirthDate = DateTimeOffset.Now.AddYears(-1 * (20 + i)) }); 
      } 

      /* the below is the "trick" to allow the for-each to work in the Logic-App. at least in my experience */ 
      var anonymousPersonWrapper = new 
      { 
       personWrapper = persons 
      }; 

      string personWrapperJsonString = JsonConvert.SerializeObject(anonymousPersonWrapper); 

      log.Info(string.Format("C# GenericWebHookCsharpOne finished a request. ('{0}')", DateTime.Now.ToLongTimeString())); 
      HttpResponseMessage returnReq = req.CreateResponse(HttpStatusCode.OK , personWrapperJsonString); 
      return returnReq; 

     } 
     catch (Exception ex) 
     { 
      string errorMsg = ex.Message; 
      log.Error(errorMsg); 
      return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg); 
     } 
    } 
} 

しかしにブレークポイントを置く "returnReqを返す"、私はpersonWrapperJsonStringは、JSONの下に含まれていることを見ることができました。

そしてI "が解析JSON"(画像の下)

enter image description here

アクションは次にIセットアップ構文解析JSONを添加しました。以下。

enter image description here

上記構文解析JSONのセットアップが完了していません。

「サンプルペイロードを使用してスキーマを生成する」ボタンをクリックすると、新しいウィンドウが表示されます。以前の "personWrapper" jsonに貼り付けます。下の画像に見られるように。

enter image description here

もちろん上記の意志あなたは(それがために、各優しいです)必要JSONスキーマを作成します。以下に示すように。

enter image description here

今、私たちはとても近くです。

がfor-それぞれ今、私たちのセットアップ(下図のように)(あなたは新しいステップを追加し、 "詳細" ボタンを使用して)するために、各

enter image description here

を追加します。現れたものを見た!にやにや笑いのために(画像下)

enter image description here

「personWrapperは」、私はちょうど私がオブジェクトのスカラプロパティの一つを手に入れることができることを示すために(セッションIDがPersonUuid値となった。以下(画像)。

enter image description here

そして今Service Busのメッセージの内容としてJSON。()画像下の

enter image description here

その後、Azure-Functionsを公開し、Logic-Appを配備し、トリガーにリクエストを送信しました。

azure portalに戻る。 PersonUuidがSessionIdとして登場しました!(下の画像)

enter image description here

そして "のぞき見" をサービスバスエクスプローラでのクイックチェック、メッセージの内容(下の画像)

enter image description here

[OK]を、いくつかのパン粉:

コレクション側を「ラッパー」とするヒントを得ました。

Json.NET validate JSON array against Schema

いくつかのエラーは、私が道

に沿って得た「無効なタイプ。期待オブジェクトが、配列を得ました。」

UnsupportedMediaType "WebHookリクエストには、JSON形式のエンティティボディが含まれている必要があります。"

「foreachのは、別のforeach」

の内側にネストすることはできません「この出力配列は」「JSON」は、そのパラメータが文字列またはXML.The提供される値のタイプである「配列であることを期待します。

2

です。あなたの場合、私たちは論理アプリケーションまたはのAzure関数からの戻りのジャーリーの配列に文字列を解析することができます。それを行うには、次のいずれかの方法を選択できます。私はまた私の側でそれをテストし、それは正しく動作します。

Azureの機能で直接ロジックのApp

json(body('Your action name')) 

enter image description here

enter image description here

それとも

戻りジャリーで

var jarry =JArray.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(persons)); 

log.Info(string.Format("C# GenericWebHookCsharpOne finished a request. ('{0}')", DateTime.Now.ToLongTimeString())); 

return req.CreateResponse(HttpStatusCode.OK, jarry); 
+0

私は最初のバージョンで作業し、得られた場所に正確に辿り着きました。それで大変感謝しています。私の最終的なゲームは、 "各"をサービスバスキューに送ることです。 (私は元の投稿で言及すべきだったと思います)そして、最初のバージョンでは、私はサービスバスキューの設定で遠くまで "ラッチする"ことはできません。私はそれが異なる結果をもたらすかどうかを見るために2番目のバージョンで作業を始めています。 – granadaCoder

+0

あなたは私にはっきりと答えてくれます。私は完全な書面で別の答えをここに入れます。ご協力いただきありがとうございます。 – granadaCoder

関連する問題