Передать строку Json в AWS Lambda в шаговой функции - ошибка JsonReaderException - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь использовать функцию AWS Lambda в функции шага. Лямбда-функция работает правильно, когда она проверяется индивидуально и вход json экранирован. Однако, когда входные данные передаются в лямбда-функцию через шаговую функцию, я получаю сообщение об ошибке JsonReaderException. Что я делаю неправильно? Будет ли сообщество знать об обходном пути для этой проблемы?

Лямбда-функция:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.Serialization.Formatters.Binary;
using Amazon.Lambda.Core;
using Newtonsoft.Json.Linq;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
namespace AWSLambda1
{
    public class Function
    {
        public void PostsBasedOnOddOrEven(string input, ILambdaContext context)
        {
            var details = JObject.Parse(input);
            var postId = (int) details["id"];
            var oddOrEvenResult = (int) details["OddOrEvenPostsResult"];
        }
    }
}

Вход в лямбда-функцию из пошаговой функции:

{
  "id": "1",
  "OddOrEvenPostsResult": 2
}

Ввод в функцию Lambda (которая работает через Visual Studio Invoke):

"{ \"id\": \"1\", \"OddOrEvenPostsResult\": 2}"

Трассировка стека исключений:

{
  "errorType": "JsonReaderException",
  "errorMessage": "Unexpected character encountered while parsing value: {. Path '', line 1, position 1.",
  "stackTrace": [
    "at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)",
    "at Newtonsoft.Json.JsonTextReader.ReadAsString()",
    "at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)",
    "at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)",
    "at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)",
    "at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)",
    "at Amazon.Lambda.Serialization.Json.JsonSerializer.Deserialize[T](Stream requestStream)",
    "at lambda_method(Closure , Stream , Stream , LambdaContextInternal )"
  ]
}

Лямбда-функция не работает, когда она является частью функции шага

Lambda Function not working when it is part of Step Function

Лямбда-функция работает при индивидуальном тестировании

Lambda Function working when tested individually

1 Ответ

0 голосов
/ 14 мая 2018

Поскольку ваша лямбда-функция ожидает, что input будет string, каркас пытается проанализировать входные данные, как будто это string.

Однако на самом деле входные данные являются объектом JSON, а не строкой.

Поэтому синтаксический анализатор завершится с ошибкой «неожиданный символ». Парсер ожидает символ ", который будет указывать на начало строки.


Итак, вот как вы можете это исправить:

  1. Объявите класс c #, который представляет входные данные

    public class FunctionInput
    {
        public int id { get; set; }
        public int OddOrEvenPostsResult { get; set; }
    }
    
  2. Измените свою подпись функции, чтобы ожидать input типа FunctionInput

    public class Function
    {    
        public void PostsBasedOnOddOrEven(FunctionInput input, ILambdaContext context)
        {
            var postId = input.id;
            var oddOrEvenResult = input.OddOrEvenPostsResult;
        }
    }
    

Примечание: вам не нужно анализировать ввод самостоятельно.

...