Для этого требования я подумал, что мы можем использовать жидкий шаблон, чтобы выполнить операцию «сгруппировать» для ваших данных json в начале. Но согласно некоторым тестам кажется, что приложение azure logi c не поддерживает "group by" в своем жидком шаблоне. Поэтому мы можем выбрать два решения:
A. Одним из решений является выполнение этих операций в приложении logi c с помощью условия «Для каждого» l oop, «If», составления данных json и многих других действий, а также мы должны инициализировать множество переменных. Сначала я попробовал это решение, но отказался от него после создания большого количества действий в приложении logi c. Это слишком сложно.
B. Другое решение - вызвать функцию azure в приложении logi c, и мы можем выполнить операции для данных json в коде функции. Это тоже не легко, но я думаю, что это лучше, чем первое решение. Поэтому я попробовал это решение и добился успеха. Пожалуйста, обратитесь к следующим шагам:
1. Нам нужно создать azure функциональное приложение с триггером «HTTP» в нем.
2. В вашем триггере "HTTP", пожалуйста, используйте мой код ниже:
#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
string body = await req.Content.ReadAsStringAsync();
JArray array = JArray.Parse(body);
JArray resultArray = new JArray();
JObject tempObj = new JObject();
foreach (var obj in array)
{
JObject jsonObj = JObject.Parse(obj.ToString());
string transactionKey = jsonObj.GetValue("transactionKey").ToString();
string messageError = jsonObj.GetValue("messageError").ToString();
Boolean hasKey = false;
foreach (var item in tempObj)
{
JObject jsonItem = (JObject)item.Value;
string keyInItem = jsonItem.GetValue("transactionKey").ToString();
if (transactionKey.Equals(keyInItem))
{
hasKey = true;
break;
}else
{
hasKey = false;
}
}
if (hasKey.Equals(false))
{
JObject newObj = new JObject();
JArray newArr = new JArray();
newArr.Add(messageError);
newObj.Add("transactionKey", transactionKey);
newObj.Add("messageErrors", newArr);
tempObj.Add(transactionKey, newObj);
}
else
{
JObject oldObj = (JObject)tempObj.GetValue(transactionKey);
JArray oldArr = (JArray)oldObj.GetValue("messageErrors");
oldArr.Add(messageError);
oldObj.Property("messageErrors").Remove();
oldObj.Add("messageErrors", oldArr);
tempObj.Property(transactionKey).Remove();
tempObj.Add(transactionKey, oldObj);
}
}
foreach (var x in tempObj)
{
resultArray.Add(x.Value);
}
return resultArray;
}
3. Проверьте и сохраните функцию, а затем go в ваше приложение c. В приложении logi c я инициализирую переменную с именем «data» с данными json ниже для имитации вашей сцены.
4. Затем создайте функцию в вашей логике c app и выберите триггер "HTTP", который вы только что создали сейчас.
5. После запуска приложения logi c мы можем получить результат, показанный ниже:
[
{
"transactionKey": "20200213215520_hUu22w9RZlyc",
"messageErrors": [
"xxxxxxxxx",
"yyyyyyyy"
]
},
{
"transactionKey": "keykey",
"messageErrors": [
"testtest11",
"testtest22",
"testtest33"
]
}
]