펑션을 통한 데이터 삽입 에러

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.11.9
  • 프로젝트명 : Castle-Hero
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 : InvalidOperationExeption, The JsonData instance has to be initialized first

안녕하세요, 뒤끝 펑션을 사용해 커스텀 기능을 구현하는 중 문제가 생겨 문의 드립니다.

신규 가입 시 차트를 불러와 계정의 기본 정보, 재화 등을 DB에 삽입하는 기능이며,
데이터에는 인벤토리, 보유 캐릭터 등이 포함될 수 있어 리스트도 포함되어있습니다.

debugConfig.json 파일을 통한 디버깅 진행 시 문제가 없어 펑션 배포를 진행했고,
이후 펑션 배포 후 테스트에서는 JsonData에서 InvalidOperationExeption 예외가 발생했습니다.
litjson의 깃허브 저장소에서 코드를 확인해봤을 때 jsonData를 인덱서로 접근 시
컬렉션을 보장해주는 메소드에서 발생한 예외였습니다.

이 후 혹시 몰라 유니티 클라이언트에 동일하게 코드를 작성 및 실행 했을 때,
디버깅 진행 시와 동일하게 문제 없이 동작했습니다.

배포된 펑션에서 Backend.GameData.Insert를 호출할 때 리스트 데이터를
제대로 처리하지 못하는 것 같습니다. 이 부분에 대해서 확인 부탁 드립니다.

///////////////////////////////////////////////////////////////////////////////////

펑션 코드 (키값, 클래스 명 등은 실제와 다름)

// 기본 데이터 차트 로딩
var defaultData = Backend.Chart.GetChartContents(DefaultChartId).FlattenRows()[0];

// 파라미터 세팅
var param = new Param();
param.Add(“gold”, 0)
param.Add(“units”, new List {
new Unit{ id = int.Parse(defaultData[“DefaultUnit”]) }
});
param.Add(“inventory”, new List());

// 데이터 삽입
var result = Backend.GameData.Insert(“tableName”, param);

// 삽입 결과 반환
return Backend.JsonToStream(result.GetReturnValueToJson());

///////////////////////////////////////////////////////////////////////////////////

에러가 발생한 Litjson 라이브러리의 JsonData 클래스 코드

private ICollection EnsureCollection ()
{
if (type == JsonType.Array)
return (ICollection) inst_array;

        if (type == JsonType.Object)
            return (ICollection) inst_object;

        throw new InvalidOperationException (
            "The JsonData instance has to be initialized first");
    }

안녕하세요 개발자님,
다음 안내드리는 내용을 확인하여 주시면 감사하겠습니다.

  1. Unit 와 같은 클래스가 펑션에도 잘 설언되어있는지 여부
  2. 비어있는 리스트를 제외하고 테스트 진행하였을 때 정상 작동 여부
    예를들어 param.Add(“inventory”, new List()); 와 같은 빈 리스트를 제외하고
    param.Add(“units”, new List {new Unit{ id = int.Parse(defaultData[“DefaultUnit”]) }}); 와 같이 적용된 값만으로 시도
  1. 파티얼 클래스로 분할해서 선언되어있습니다.
  2. 빈 리스트 제거 후에도 동일하게 발생합니다.

확인 감사합니다.
해당 내용을 토대로 확인 후 답변드리겠습니다.
시간 양해 부탁드립니다.

안녕하세요 개발자님,
다음과 같은 코드를 펑션에서 동작했을 때 하단의 스크린샷과 같이 이상 없이 정상적으로 삽입되는 것을 확인하였습니다.
안내드리는 코드와 다른 특이점이 있는지 확인하여 주시면 감사하겠습니다.

using Amazon.Lambda.Core;
using BackEnd;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

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

namespace BackendFunction
{
    public class Unit
    {
        public int id;
    }
    public class BFunc
    {

        public Stream Function(Stream stream, ILambdaContext context)
        {
            StringBuilder str = new StringBuilder();
            try
            {
                // Initialize BackendFunction API
                Backend.Initialize(ref stream);

                var param = new Param();
                param.Add("gold", 0);


                List<Unit> list = new List<Unit>() {
                    new Unit{ id = 1 },
                    new Unit{ id = 2 },
                    new Unit{ id = 3 }
                };

                param.Add("units", list);
                param.Add("inventory", new List<Unit>());


                var result = Backend.GameData.Insert("score", param);
                str.AppendLine("Insert result: " + result.ToString());

            }
            catch (Exception e)
            {
                //Return the reason if Initializing BackendFunction API was failed
                return ReturnErrorObject("initialize " + e.ToString());
            }
            // If return the value by Stream type, the value will send to Backend SDK 
            return Backend.StringToStream(str.ToString());
        }
        static Stream ReturnErrorObject(string err)
        {
            JObject error = new JObject();
            error.Add("error", err);
            return Backend.JsonToStream(error.ToString());
        }
    }
}

이후에 확인을 해봤는데, 삽입까지는 문제가 없으나 GetMyData를 통해 데이터를 가져오는 경우, Litjson에서 빈 배열을 처리하지 못해 발생한 에러인 것 같습니다.