서버에서 LIST 불러오기

안녕하세요.
JSON DATA관련하여 문의를 잘해주신 덕분에 LIST형태로 게임정보를 업로드 하였습니다.
코드는 하기와 같습니다.

public List<Item_Json> items_Json = new List<Item_Json>();
public void SaveJsonFile()
{
param.Add(“Hero”, items_Json);
Backend.GameData.Insert ( “Info”, param );
}

위의 코드를 이용하여 업로드된 LIST형태의 자료가 하기와 같이 뒤끝서버로 잘 업로드 된 것을 확인하였습니다.
[
{
“item_Star_Json”: 1,
“item_Type_Json”: 1,
“item_IsMake_Json”: 1,
“item_Health_Json”: 0,
“item_Name_Json”: “무딘 검”,
“item_Qty_Json”: 1,
“item_CriticalDamage_Json”: 0,
“item_Id_Json”: 0,
“item_Damage_Json”: 20,
“item_CriticalChance_Json”: 0,
“item_MatterialType_Json”: 0,
“item_Upgrade_Json”: 1,
“item_IsUse_Json”: 1
},
{
“item_Star_Json”: 1,
“item_Type_Json”: 1,
“item_IsMake_Json”: 0,
“item_Health_Json”: 0,
“item_Name_Json”: “훈련용 검”,
“item_Qty_Json”: 0,
“item_CriticalDamage_Json”: 0,
“item_Id_Json”: 1,
“item_Damage_Json”: 50,
“item_CriticalChance_Json”: 0,
“item_MatterialType_Json”: 0,
“item_Upgrade_Json”: 1,
“item_IsUse_Json”: 0
},

문제는 GameData.Get을 활용하여 LIST형태 그대로 다시 게임으로 불러오는 것이 가능하다고 답변 주셨는데
가이드를 읽어봐도 감을 잡기 힘들어 재문의 드립니다.
위와 같이 업로드된 LIST형태의 자료들을 다시 items_Json에 파싱하는 코드의 예를 보여주시면 감사하겠습니다.

안녕하세요 개발자님.

클래스로 구성된 List 혹은 Map의 경우에는 다음과 같이 이용해야 합니다.

  1. 배열 속 데이터를 각각 가져오기.
  2. 서버에서 불러온 모든 값을 새로운 List에 넣기.

아래와 같이 해당 클래스에 뒤끝의 JsonData를 파싱하여 각각의 변수에 값을 대입할 수 있는 기능을 추가하고(두번째 코드 참조),
데이터를 불러올 때에 다시 해당 함수를 이용하여 각각 클래스 데이터에 값을 대입할 수 있도록 구성해주시면 되겠습니다.

void GetData()
{
     //서버에서 불러온 데이터를 저장할 List
     List<Item_data> item_list = new List<Item_data>();

     // 데이터를 불러와 언마샬(["S"], ["M"]등 제거하기)
     var bro = Backend.GameData.GetMyData("Item", new Where()).FlattenRows();
     //bro[0] 은 제일 최신의 row입니다.
     foreach (JsonData json in bro[0]["list"])
     {
          //new Item_data(json)을 통해 서버에서 불러온 json의 값을 해체하여 각각 변수에 대입하기
          item_list.Add(new Item_data(json));
      }
}
class Item_data
{
    public int item_Star_Json = 0;
    public int item_Type_Json = 0;
    public int item_IsMake_Json = 0;
    public int item_Health_Json = 0;
    public string item_Name_Json = "무딘 검";
    // ...

    public Item_data(JsonData json)
    {
        item_Star_Json = Int32.Parse(json["item_Star_Json"].ToString());
        item_Type_Json = Int32.Parse(json["item_Type_Json"].ToString());
        item_IsMake_Json = Int32.Parse(json["item_IsMake_Json"].ToString());
        item_Health_Json = Int32.Parse(json["item_Health_Json"].ToString());
        item_Name_Json = json["item_Name_Json"].ToString();
        //...
    }
}
  • 추가로 전에 말씀드린 List에서 파싱하는 것 또한 위 방식처럼 데이터를 받아 각각 변수에 대입하는 식으로 파싱해야하는 점 참고 부탁드립니다.

답변감사드립니다.
답변주신 사항들 반영하여 실행을 하면 하기와 같은 오류가 뜹니다.

foreach (JsonData json in bro[0][“list”]) 이분에서 key값을 못찾는 것 같은데…
이부분에 대한 문의드립니다.

또한, foreeach구문은 알지만, bro[0][“list”]에서 bro가 어떤형태길래 [0]과 [“list”]을 왜 붙여야 되는지 문의드립니다.

KeyNotFoundException: The given key was not present in the dictionary.
System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) (at <695d1cc93cca45069c528c15c9fdd749>:0)
LitJson.JsonData.get_Item (System.String prop_name) (at <498e8279b39b41478600b851a0c83f73>:0)
Item_Database_Json+d__14.MoveNext () (at Assets/Scripts/Item/Item_Database_Json.cs:110)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at :0)
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
Item_Database_Json:LoadJsonFile() (at Assets/Scripts/Item/Item_Database_Json.cs:100)
UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

아래는 서버에서 LIST자료형을 게임으로 로드하는 코드입니다.

public class Item_data

{

public string item_Name_Json;   

public int item_Type_Json;           

public int item_Upgrade_Json;    

public int item_Damage_Json;        

public int item_Health_Json;       

public int item_CriticalDamage_Json;

public int item_CriticalChance_Json;

public int item_Id_Json;

public int item_IsUse_Json;

public int item_IsMake_Json;

public int item_MatterialType_Json;

public int item_Qty_Json;

public int item_Star_Json;

public Item_data (JsonData json)

{

    item_Name_Json= json["item_Name_Json"].ToString();

    item_Type_Json= int.Parse(json["item_Type_Json"].ToString());

    item_Upgrade_Json= int.Parse(json["item_Upgrade_Json"].ToString());

    item_Damage_Json= int.Parse(json["item_Damage_Json"].ToString());

    item_Health_Json= int.Parse(json["item_Health_Json"].ToString());

    item_CriticalDamage_Json= int.Parse(json["item_CriticalDamage_Json"].ToString());

    item_CriticalChance_Json= int.Parse(json["item_CriticalChance_Json"].ToString());

    item_Id_Json= int.Parse(json["item_Id_Json"].ToString());

    item_IsUse_Json= int.Parse(json["item_IsUse_Json"].ToString());

    item_IsMake_Json= int.Parse(json["item_IsMake_Json"].ToString());

    item_MatterialType_Json= int.Parse(json["item_MatterialType_Json"].ToString());

    item_Qty_Json= int.Parse(json["item_Qty_Json"].ToString());

    item_Star_Json= int.Parse(json["item_Star_Json"].ToString());

}

}

public void LoadJsonFile()

{

    StartCoroutine(Load()); 

}

IEnumerator Load()

{

    var bro = Backend.GameData.GetMyData("Item", new Where()).FlattenRows();

    i=0;

    foreach (JsonData json in bro[0]["list"]) 

    {

      items_List[i]=new Item_data(json);

      i++;

    }

    yield return null;

}

[“list”]의 경우 List<Item_data> 데이터를 Param에 추가했을 때 key값으로 설정한 값입니다.

예제의 경우 List<Item_data>를 param.Add(“list”, item_list) 이러한 형태로 값을 넣었기 때문에 불러올 때 리턴된 컬럼의 이름이 list 였습니다.

개발자님의 경우에는 param.Add(“Hero”, items_Json); 에서 items_Json이 List<Item_data>라면 Hero가 컬럼명이므로 [“Hero”]를 통해 가져올 수 있습니다.

[0]의 경우에는 Where() 데이터로 불러올 시, 1개 이상의 데이터가 리턴이 됩니다. 데이터가 여러개일 경우 rows 컬럼 이후에는 값 row가 배열 형태로 이루어져있기에 배열처럼 접근해야합니다.

그중 제일 최근에 삽입된 데이터가 위로 가는 구조이므로 데이터가 하나만 있거나 최신 데이터를 가져오려면 [0]을 통해 접근할 수 있습니다.

Backend.GameData.GetMyData의 bro를 Debug.Log(bro)를 통해 리턴값이 어떤 Json으로 되어있는지 확인하면 데이터 접근 이해에 도움이 도니 참고부탁드립니다.

추가적으로 확인해본 결과, Json의 기능 중 리턴된 데이터를 다시 클래스로 변환시키는 함수도 있으니
클래스의 멤버변수가 전부 public이라면 해당 개발자문서도 참고해주시면 감사하겠습니다.

IEnumerator Load()

{

    var bro = Backend.GameData.GetMyData("Info", new Where()).FlattenRows();

    i=0;

    foreach (JsonData json in bro[0]["Hero"]) 

    {
      var item = LitJson.JsonMapper.ToObject<Item_data>(json.ToJson());
      items_List[i]= item;
      i++;

    }

    yield return null;

}