При тестировании навыка alexa возвращается «Ошибка преобразования полезной нагрузки JSON события Lambda в строку» - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь заставить устройство Alexa произносить строку текста, которую я возвращаю из своей функции Lambda, написанной на C #.

Сейчас я написал базовый метод, который возвращает строку.

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AlexaTeachMeNewWord
{
    public class Function
    {
        public string FunctionHandler(object input, ILambdaContext context)
        {
            return "Hello this is a test";
        }
    }
}

При использовании инструментария AWS для Visual Studio 2019, если я протестирую функцию с примером вызова Alexa, строка текста будет явно возвращена.

Alexa skill test

Однако, как только я опубликовал функцию в AWS Lambda, я получаю следующую ошибку, сообщающую мне Error converting the Lambda event JSON payload to a string

{
  "errorType": "JsonSerializerException",
  "errorMessage": "Error converting the Lambda event JSON payload to a string. JSON strings must be quoted, for example \"Hello World\" in order to be converted to a string: Unexpected character encountered while parsing value: {. Path '', line 1, position 1.",
  "stackTrace": [
    "at Amazon.Lambda.Serialization.Json.JsonSerializer.Deserialize[T](Stream requestStream)",
    "at lambda_method(Closure , Stream , Stream , LambdaContextInternal )"
  ],
  "cause": {
    "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)"
    ]
  }
}

Это сбивает с толку, поскольку я не пытаюсь вернуть JSONполезная нагрузка.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

После дальнейшего изучения я обнаружил, что Alexa не просто говорит возвращаемую строку, вам нужно создать объект ответа и вернуть его.

Используя Alexa.NET, я пишу следующий класс, который позволяет мнепоручить устройству Alexa произносить мою текстовую строку.

Надеюсь, это кому-нибудь поможет.

public class Function
{
    public SkillResponse FunctionHandler(SkillRequest req, ILambdaContext context)
    {
        // create the speech response
        var speech = new SsmlOutputSpeech();
        speech.Ssml = "<speak>This is an test.</speak>";

        // create the response
        var responseBody = new ResponseBody();
        responseBody.OutputSpeech = speech;
        responseBody.ShouldEndSession = true; // this triggers the reprompt
        responseBody.Card = new SimpleCard { Title = "Test", Content = "Testing Alexa" };

        var skillResponse = new SkillResponse();
        skillResponse.Response = responseBody;
        skillResponse.Version = "1.0";

        return skillResponse;
    }
}
0 голосов
/ 24 сентября 2019

Кажется, что ваш ввод данных не является допустимым JSON.Если вы не используете объект ввода, вы можете попробовать использовать функцию без него

public string FunctionHandler(ILambdaContext context) {
     return "Hello this is a test";
}
...