Как объединить JSON строк в приложении logi c, сгруппированном по другому свойству - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть приложение logi c, которое принимает сбой, работает от записи приложения до понимания приложения, и я хочу сгруппировать все ошибки по имени операции в одно сообщение. Может кто-нибудь объяснить, как это сделать?

мои начальные данные выглядят следующим образом:

[{ "messageError": "Notification sent to AppName but not received for request: 20200213215520_hUu22w9RZlyc, user email@email.com Status: NotFound", 
   "transactionKey": "20200213215520_hUu22w9RZlyc"},
 { "messageError": "App to App Import Request: 20200213215520_hUu22w9RZlyc from user email@email.com was unable to insert to following line(s) into App with error(s) :\r\n Line 123: Unable to unlock this record.", 
   "transactionKey": "20200213215520_hUu22w9RZlyc"}]

То, что я пытаюсь извлечь из этого, - это одна строка, которая объединяет оба значения messageError в одну инструкцию общего ключа транзакции. Примерно так:

[{ "messageErrors": [{"Notification sent to AppName but not received for request: 20200213215520_hUu22w9RZlyc, user email@email.com Status: NotFound"}, 
                     {"App to App Import Request: 20200213215520_hUu22w9RZlyc from user email@email.com was unable to insert to following line(s) into App with error(s) :\r\n Line 123: Unable to unlock this record."}], 
   "transactionKey": "20200213215520_hUu22w9RZlyc"}]

В наборе данных может быть до 20 строк, и объединение должно быть достаточно умным, чтобы сгруппировать его только в том случае, если имеется несколько строк с одним и тем же Ключом транзакции. Кто-нибудь делал это, и есть предложения, как их сгруппировать?

1 Ответ

0 голосов
/ 19 февраля 2020

Для этого требования я подумал, что мы можем использовать жидкий шаблон, чтобы выполнить операцию «сгруппировать» для ваших данных 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 ниже для имитации вашей сцены. enter image description here

4. Затем создайте функцию в вашей логике c app и выберите триггер "HTTP", который вы только что создали сейчас.

5. После запуска приложения logi c мы можем получить результат, показанный ниже:

[
  {
    "transactionKey": "20200213215520_hUu22w9RZlyc",
    "messageErrors": [
      "xxxxxxxxx",
      "yyyyyyyy"
    ]
  },
  {
    "transactionKey": "keykey",
    "messageErrors": [
      "testtest11",
      "testtest22",
      "testtest33"
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...