10#include "JsonObjectConverter.h"
15#include "Misc/Base64.h"
16#include "Interfaces/IHttpResponse.h"
17#include "Dom/JsonObject.h"
18#include "Dom/JsonValue.h"
20#include "Serialization/JsonReader.h"
21#include "Serialization/JsonSerializer.h"
22#include "Serialization/JsonWriter.h"
27 return FString::Printf(TEXT(
"<a id=\"%d\" content=\"link\">%s</> "), Index, *
Kor);
32 TArray<FString> KorWords;
33 Kor.ParseIntoArray(KorWords, TEXT(
" "),
true);
35 TArray<FString> PronWords;
38 TArray<FPhonemeData> WordDataArray;
40 for (int32 i = 0; i < KorWords.Num(); ++i)
43 Data.
Kor = i < KorWords.Num() ? KorWords[i] : TEXT(
"");
44 Data.
Pronunciation = i < PronWords.Num() ? PronWords[i] : TEXT(
"");
46 WordDataArray.Add(Data);
54 if (!Response.IsValid())
59 FString JsonString = Response->GetContentAsString();
60 TSharedPtr<FJsonObject> JsonObject;
61 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
63 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
65 user_id = JsonObject->GetIntegerField(TEXT(
"user_id"));
67 TArray<TSharedPtr<FJsonValue>> questionArray = JsonObject->GetArrayField(TEXT(
"question"));
69 for (
const auto& data : questionArray)
72 TSharedPtr<FJsonObject> dataObject = data->AsObject();
73 if (!dataObject.IsValid())
78 if (dataObject->HasTypedField<EJson::Object>(TEXT(
"word_data")))
80 const TSharedPtr<FJsonObject> DisplayObj = dataObject->GetObjectField(TEXT(
"word_data"));
81 temp.
word_data.
kor = DisplayObj->GetStringField(TEXT(
"kor"));
82 temp.
word_data.
eng = DisplayObj->GetStringField(TEXT(
"eng"));
86 temp.
answer = dataObject->GetStringField(TEXT(
"answer"));
87 temp.
answer_kor = dataObject->GetStringField(TEXT(
"answer_kor"));
106 if (Response.IsValid())
108 status = Response->GetResponseCode();
114 FString OutputString;
115 FJsonObjectConverter::UStructToJsonObjectString(
126 if (!Response.IsValid())
131 FString JsonString = Response->GetContentAsString();
132 TSharedPtr<FJsonObject> JsonObject;
133 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
135 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
137 id = JsonObject->GetIntegerField(TEXT(
"id"));
138 username = JsonObject->GetStringField(TEXT(
"username"));
139 email = JsonObject->GetStringField(TEXT(
"email"));
140 is_active = JsonObject->GetBoolField(TEXT(
"is_active"));
146 FString OutputString;
147 FJsonObjectConverter::UStructToJsonObjectString(
159 if (!Response.IsValid())
164 FString JsonString = Response->GetContentAsString();
165 TSharedPtr<FJsonObject> JsonObject;
166 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
168 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
170 access_token = JsonObject->GetStringField(TEXT(
"access_token"));
176 FString OutputString;
177 FJsonObjectConverter::UStructToJsonObjectString(
190 if (!Response.IsValid())
195 FString JsonString = Response->GetContentAsString();
196 TSharedPtr<FJsonObject> JsonObject;
197 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
199 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
201 id = JsonObject->GetIntegerField(TEXT(
"id"));
202 username = JsonObject->GetStringField(TEXT(
"username"));
203 fullname = JsonObject->GetStringField(TEXT(
"fullname"));
204 is_active = JsonObject->GetBoolField(TEXT(
"is_active"));
205 my_avatar = JsonObject->GetStringField(TEXT(
"my_avatar"));
206 my_color = JsonObject->GetStringField(TEXT(
"my_color"));
212 FString OutputString;
213 FJsonObjectConverter::UStructToJsonObjectString(
229 if ( player_index == 0)
231 else if ( player_index == 1)
240 return FColor::FromHex(TEXT(
"007BE8FF"));
243 if ( player_index == 0)
244 return FColor::FromHex(TEXT(
"FFFFFF"));
245 if ( player_index == 1)
246 return FColor::FromHex(TEXT(
"FFFFFF"));
248 return FColor::FromHex(TEXT(
"E94C4CFF"));
259 FString OutputString;
260 FJsonObjectConverter::UStructToJsonObjectString(
409 if (!Response.IsValid())
414 FString JsonString = Response->GetContentAsString();
416 TArray<TSharedPtr<FJsonValue>> JsonArray;
417 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
419 if (FJsonSerializer::Deserialize(Reader, JsonArray))
421 for (
const TSharedPtr<FJsonValue>& EntryValue : JsonArray)
423 if (EntryValue.IsValid())
425 TSharedPtr<FJsonObject> EntryObject = EntryValue->AsObject();
426 if (!EntryObject.IsValid())
433 if (EntryObject->HasTypedField<EJson::Object>(TEXT(
"display")))
435 const TSharedPtr<FJsonObject> DisplayObj = EntryObject->GetObjectField(TEXT(
"display"));
436 Entry.
display.
is_pass = DisplayObj->GetBoolField(TEXT(
"is_pass"));
437 Entry.
display.
message = DisplayObj->GetStringField(TEXT(
"message"));
441 if (EntryObject->HasTypedField<EJson::Object>(TEXT(
"record")))
443 const TSharedPtr<FJsonObject> RecordObj = EntryObject->GetObjectField(TEXT(
"record"));
444 Entry.
record.
score = RecordObj->GetIntegerField(TEXT(
"score"));
445 Entry.
record.
target = RecordObj->GetStringField(TEXT(
"target"));
446 Entry.
record.
input = RecordObj->GetStringField(TEXT(
"input"));
447 Entry.
record.
stage = RecordObj->GetStringField(TEXT(
"stage"));
460 NETWORK_LOG( TEXT(
"[OCR Extract] Response - Is_Pass: %d, Text: %s"), data.display.is_pass, *(data.display.message));
466 TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
468 JsonObject->SetNumberField(TEXT(
"room_id"),
room_id);
469 JsonObject->SetNumberField(TEXT(
"user_id"),
user_id);
470 JsonObject->SetNumberField(TEXT(
"scenario_id"),
scenario_id);
471 JsonObject->SetNumberField(TEXT(
"stage_type"),
stage_type);
472 JsonObject->SetNumberField(TEXT(
"state_type"),
state_type);
473 JsonObject->SetNumberField(TEXT(
"result_time"),
result_time);
475 TArray<TSharedPtr<FJsonValue>> WrongIdxArray;
478 WrongIdxArray.Add(MakeShared<FJsonValueNumber>(Idx));
480 JsonObject->SetArrayField(TEXT(
"wrong_idx"), WrongIdxArray);
482 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJson);
483 return FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
488 if (!Response.IsValid())
493 FString JsonString = Response->GetContentAsString();
495 TSharedPtr<FJsonObject> JsonObject;
496 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
498 if (FJsonSerializer::Deserialize(Reader, JsonObject))
500 if (JsonObject.IsValid())
502 JsonObject->TryGetStringField(TEXT(
"grade"), this->
grade);
503 this->
average_score = JsonObject->GetIntegerField(TEXT(
"average_score"));
504 this->
top_percent = JsonObject->GetIntegerField(TEXT(
"top_percent"));
506 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"scores")))
508 TArray<TSharedPtr<FJsonValue>> JsonArray = JsonObject->GetArrayField(TEXT(
"scores"));
509 for (
const auto& score : JsonArray)
512 Entry.
score = score->AsObject()->GetBoolField(TEXT(
"score"));
513 Entry.
desc = score->AsObject()->GetStringField(TEXT(
"desc"));
524 if (!Response.IsValid())
529 FString ResponseBody = Response->GetContentAsString();
531 TSharedPtr<FJsonObject> JsonObject;
532 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseBody);
534 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
536 JsonObject->TryGetStringField(TEXT(
"audio_text"),
audio_text);
539 JsonObject->TryGetStringField(TEXT(
"audio_base64"), audio_data);
564 if (!Response.IsValid())
569 FString JsonString = Response->GetContentAsString();
570 TSharedPtr<FJsonObject> JsonObject;
571 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
573 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
575 grammar_score = JsonObject->GetIntegerField(TEXT(
"grammar_score"));
576 context_score = JsonObject->GetIntegerField(TEXT(
"context_score"));
578 final_feedback = JsonObject->GetStringField(TEXT(
"final_feedback"));
584 FString OutputString;
585 FJsonObjectConverter::UStructToJsonObjectString(
596 TArray<FResultStatData> StatDataList;
602 GrammarData.
TitleText = FText::FromString(TEXT(
"Grammer"));
605 StatDataList.Add(GrammarData);
611 ContextData.
TitleText = FText::FromString(TEXT(
"Context"));
614 StatDataList.Add(ContextData);
620 OverallData.
TitleText = FText::FromString(TEXT(
"Score"));
623 StatDataList.Add(OverallData);
631 if (!Response.IsValid())
636 FString JsonString = Response->GetContentAsString();
637 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
638 TArray<TSharedPtr<FJsonValue>> JsonArray;
640 if (FJsonSerializer::Deserialize(Reader, JsonArray))
644 for (
const auto& JsonValue : JsonArray)
646 TSharedPtr<FJsonObject> JsonObject = JsonValue->AsObject();
647 if (JsonObject.IsValid())
650 QuestionData.
Id = JsonObject->GetIntegerField(TEXT(
"id"));
651 QuestionData.
TypeCode = JsonObject->GetIntegerField(TEXT(
"type_code"));
652 QuestionData.
Eng = JsonObject->GetStringField(TEXT(
"eng"));
653 QuestionData.
Kor = JsonObject->GetStringField(TEXT(
"kor"));
654 QuestionData.
EngKey = JsonObject->GetStringField(TEXT(
"eng_key"));
655 QuestionData.
KorKey = JsonObject->GetStringField(TEXT(
"kor_key"));
658 JsonObject->TryGetStringField(TEXT(
"created_at"), QuestionData.
CreatedAt);
668 NETWORK_LOG(TEXT(
"[Interview Hello] Failed to parse JSON array"));
677 NETWORK_LOG(TEXT(
" - ID: %d, TypeCode: %d, Eng: %s, Kor: %s"),
678 Question.Id, Question.TypeCode, *Question.Eng, *Question.Kor);
688 TArray<TSharedPtr<FJsonValue>> JsonArray;
692 TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
693 JsonObject->SetNumberField(TEXT(
"interview_id"), AnswerData.interview_id);
694 JsonObject->SetStringField(TEXT(
"answer"), AnswerData.answer);
695 JsonObject->SetNumberField(TEXT(
"user_id"), AnswerData.user_id);
697 JsonArray.Add(MakeShared<FJsonValueObject>(JsonObject));
700 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJson);
701 return FJsonSerializer::Serialize(JsonArray, Writer);
710 if (!Response.IsValid())
715 FString JsonString = Response->GetContentAsString();
716 NETWORK_LOG(TEXT(
"[Interview Answer] Response: %s"), *JsonString);
721 NETWORK_LOG(TEXT(
"[Interview Answer] Response processed successfully"));
729 if (!Response.IsValid())
734 FString JsonString = Response->GetContentAsString();
735 TSharedPtr<FJsonObject> JsonObject;
736 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
738 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
740 index = JsonObject->GetIntegerField(TEXT(
"index"));
741 dificulity = JsonObject->GetIntegerField(TEXT(
"dificulity"));
742 room_id = JsonObject->GetIntegerField(TEXT(
"room_id"));
746 const TArray<TSharedPtr<FJsonValue>>* TargetDataArray;
747 if (JsonObject->TryGetArrayField(TEXT(
"target_data"), TargetDataArray))
749 for (
const auto& Item : *TargetDataArray)
751 TSharedPtr<FJsonObject> TargetObj = Item->AsObject();
752 if (TargetObj.IsValid())
757 if (TargetObj->HasTypedField<EJson::Object>(TEXT(
"word1")))
759 TSharedPtr<FJsonObject> Word1Obj = TargetObj->GetObjectField(TEXT(
"word1"));
760 if (Word1Obj.IsValid())
762 TargetItem.
word1.
name = Word1Obj->GetStringField(TEXT(
"name"));
763 TargetItem.
word1.
code = Word1Obj->GetStringField(TEXT(
"code"));
768 if (TargetObj->HasTypedField<EJson::Object>(TEXT(
"word2")))
770 TSharedPtr<FJsonObject> Word2Obj = TargetObj->GetObjectField(TEXT(
"word2"));
771 if (Word2Obj.IsValid())
773 TargetItem.
word2.
name = Word2Obj->GetStringField(TEXT(
"name"));
774 TargetItem.
word2.
code = Word2Obj->GetStringField(TEXT(
"code"));
784 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"word_data1")))
786 TSharedPtr<FJsonObject> WordData1Obj = JsonObject->GetObjectField(TEXT(
"word_data1"));
787 FJsonObjectConverter::JsonObjectToUStruct(WordData1Obj.ToSharedRef(), FWordData::StaticStruct(), &
word_data1);
791 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"word_data2")))
793 TSharedPtr<FJsonObject> WordData2Obj = JsonObject->GetObjectField(TEXT(
"word_data2"));
794 FJsonObjectConverter::JsonObjectToUStruct(WordData2Obj.ToSharedRef(), FWordData::StaticStruct(), &
word_data2);
798 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"full_data")))
800 TSharedPtr<FJsonObject> FullDataObj = JsonObject->GetObjectField(TEXT(
"full_data"));
801 FJsonObjectConverter::JsonObjectToUStruct(FullDataObj.ToSharedRef(), FWordData::StaticStruct(), &
full_data);
808 FString OutputString;
809 FJsonObjectConverter::UStructToJsonObjectString(
820 TSet<FString> UniqueSet;
824 if (!TargetData.word1.name.IsEmpty())
826 UniqueSet.Add(TargetData.word1.name);
830 return UniqueSet.Array();
835 TSet<FString> UniqueSet;
839 if (!TargetData.word2.name.IsEmpty())
841 UniqueSet.Add(TargetData.word2.name);
845 return UniqueSet.Array();
858 TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
860 JsonObject->SetNumberField(TEXT(
"room_id"),
room_id);
861 JsonObject->SetNumberField(TEXT(
"user_id"),
user_id);
862 JsonObject->SetNumberField(TEXT(
"scenario_id"),
scenario_id);
863 JsonObject->SetNumberField(TEXT(
"stage_type"),
stage_type);
864 JsonObject->SetNumberField(TEXT(
"state_type"),
state_type);
865 JsonObject->SetNumberField(TEXT(
"result_time"),
result_time);
867 TArray<TSharedPtr<FJsonValue>> WrongIdxArray;
870 WrongIdxArray.Add(MakeShared<FJsonValueNumber>(Idx));
872 JsonObject->SetArrayField(TEXT(
"wrong_idx"), WrongIdxArray);
874 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJson);
875 return FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
880 if (!Response.IsValid())
885 FString JsonString = Response->GetContentAsString();
886 TSharedPtr<FJsonObject> JsonObject;
887 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
889 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
891 JsonObject->TryGetStringField(TEXT(
"grade"),
grade);
892 JsonObject->TryGetNumberField(TEXT(
"average_score"),
average_score);
893 JsonObject->TryGetNumberField(TEXT(
"top_percent"),
top_percent);
896 if (JsonObject->HasTypedField<EJson::Array>(TEXT(
"scores")))
898 TArray<TSharedPtr<FJsonValue>> JsonArray = JsonObject->GetArrayField(TEXT(
"scores"));
899 for (
const auto& ScoreValue : JsonArray)
901 if (ScoreValue->Type == EJson::Object)
903 TSharedPtr<FJsonObject> ScoreObj = ScoreValue->AsObject();
905 ScoreObj->TryGetNumberField(TEXT(
"score"), Entry.
score);
906 ScoreObj->TryGetStringField(TEXT(
"desc"), Entry.
desc);
916 FString OutputString;
917 FJsonObjectConverter::UStructToJsonObjectString(
932 if (!Response.IsValid())
937 FString JsonString = Response->GetContentAsString();
938 TSharedPtr<FJsonObject> JsonObject;
939 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
941 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
943 index = JsonObject->GetIntegerField(TEXT(
"index"));
944 dificulity = JsonObject->GetIntegerField(TEXT(
"dificulity"));
945 room_id = JsonObject->GetIntegerField(TEXT(
"room_id"));
949 const TArray<TSharedPtr<FJsonValue>>* TargetDataArray;
950 if (JsonObject->TryGetArrayField(TEXT(
"target_data"), TargetDataArray))
952 for (
const auto& Item : *TargetDataArray)
954 TSharedPtr<FJsonObject> TargetObj = Item->AsObject();
955 if (TargetObj.IsValid())
960 if (TargetObj->HasTypedField<EJson::Object>(TEXT(
"word1")))
962 TSharedPtr<FJsonObject> Word1Obj = TargetObj->GetObjectField(TEXT(
"word1"));
963 if (Word1Obj.IsValid())
965 TargetItem.
word1.
name = Word1Obj->GetStringField(TEXT(
"name"));
966 TargetItem.
word1.
code = Word1Obj->GetStringField(TEXT(
"code"));
971 if (TargetObj->HasTypedField<EJson::Object>(TEXT(
"word2")))
973 TSharedPtr<FJsonObject> Word2Obj = TargetObj->GetObjectField(TEXT(
"word2"));
974 if (Word2Obj.IsValid())
976 TargetItem.
word2.
name = Word2Obj->GetStringField(TEXT(
"name"));
977 TargetItem.
word2.
code = Word2Obj->GetStringField(TEXT(
"code"));
987 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"word_data1")))
989 TSharedPtr<FJsonObject> WordData1Obj = JsonObject->GetObjectField(TEXT(
"word_data1"));
990 FJsonObjectConverter::JsonObjectToUStruct(WordData1Obj.ToSharedRef(), FWordData::StaticStruct(), &
word_data1);
994 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"word_data2")))
996 TSharedPtr<FJsonObject> WordData2Obj = JsonObject->GetObjectField(TEXT(
"word_data2"));
997 FJsonObjectConverter::JsonObjectToUStruct(WordData2Obj.ToSharedRef(), FWordData::StaticStruct(), &
word_data2);
1001 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"full_data")))
1003 TSharedPtr<FJsonObject> FullDataObj = JsonObject->GetObjectField(TEXT(
"full_data"));
1004 FJsonObjectConverter::JsonObjectToUStruct(FullDataObj.ToSharedRef(), FWordData::StaticStruct(), &
full_data);
1008 FString VoiceDataString;
1009 if (JsonObject->TryGetStringField(TEXT(
"voice_data"), VoiceDataString))
1011 FBase64::Decode(VoiceDataString,
voice_data);
1018 FString OutputString;
1019 FJsonObjectConverter::UStructToJsonObjectString(
1030 TSet<FString> UniqueSet;
1034 if (!TargetData.word1.name.IsEmpty())
1036 UniqueSet.Add(TargetData.word1.name);
1040 return UniqueSet.Array();
1045 TSet<FString> UniqueSet;
1049 if (!TargetData.word2.name.IsEmpty())
1051 UniqueSet.Add(TargetData.word2.name);
1055 return UniqueSet.Array();
1068 TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
1070 JsonObject->SetNumberField(TEXT(
"room_id"),
room_id);
1071 JsonObject->SetNumberField(TEXT(
"user_id"),
user_id);
1072 JsonObject->SetNumberField(TEXT(
"scenario_id"),
scenario_id);
1073 JsonObject->SetNumberField(TEXT(
"stage_type"),
stage_type);
1074 JsonObject->SetNumberField(TEXT(
"state_type"),
state_type);
1075 JsonObject->SetNumberField(TEXT(
"result_time"),
result_time);
1077 TArray<TSharedPtr<FJsonValue>> WrongIdxArray;
1080 WrongIdxArray.Add(MakeShared<FJsonValueNumber>(Idx));
1082 JsonObject->SetArrayField(TEXT(
"wrong_idx"), WrongIdxArray);
1084 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJson);
1085 return FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
1090 if (!Response.IsValid())
1095 FString JsonString = Response->GetContentAsString();
1096 TSharedPtr<FJsonObject> JsonObject;
1097 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
1099 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
1101 JsonObject->TryGetStringField(TEXT(
"grade"),
grade);
1102 JsonObject->TryGetNumberField(TEXT(
"average_score"),
average_score);
1103 JsonObject->TryGetNumberField(TEXT(
"top_percent"),
top_percent);
1106 if (JsonObject->HasTypedField<EJson::Array>(TEXT(
"scores")))
1108 TArray<TSharedPtr<FJsonValue>> JsonArray = JsonObject->GetArrayField(TEXT(
"scores"));
1109 for (
const auto& ScoreValue : JsonArray)
1111 if (ScoreValue->Type == EJson::Object)
1113 TSharedPtr<FJsonObject> ScoreObj = ScoreValue->AsObject();
1115 ScoreObj->TryGetNumberField(TEXT(
"score"), Entry.
score);
1116 ScoreObj->TryGetStringField(TEXT(
"desc"), Entry.
desc);
1126 FString OutputString;
1127 FJsonObjectConverter::UStructToJsonObjectString(
1139 TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
1141 JsonObject->SetNumberField(TEXT(
"room_id"),
room_id);
1142 JsonObject->SetNumberField(TEXT(
"user_id"),
user_id);
1143 JsonObject->SetNumberField(TEXT(
"scenario_id"),
scenario_id);
1144 JsonObject->SetNumberField(TEXT(
"stage_type"),
stage_type);
1145 JsonObject->SetNumberField(TEXT(
"state_type"),
state_type);
1146 JsonObject->SetNumberField(TEXT(
"result_time"),
result_time);
1148 TArray<TSharedPtr<FJsonValue>> WrongIdxArray;
1151 WrongIdxArray.Add(MakeShared<FJsonValueNumber>(Idx));
1153 JsonObject->SetArrayField(TEXT(
"wrong_idx"), WrongIdxArray);
1155 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJson);
1156 return FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
1166 if (!Response.IsValid())
1171 FString JsonString = Response->GetContentAsString();
1172 TSharedPtr<FJsonObject> JsonObject;
1173 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
1175 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
1177 grade = JsonObject->GetStringField(TEXT(
"grade"));
1178 average_score = JsonObject->GetIntegerField(TEXT(
"average_score"));
1179 top_percent = JsonObject->GetNumberField(TEXT(
"top_percent"));
1182 const TArray<TSharedPtr<FJsonValue>>* ScoresArray;
1183 if (JsonObject->TryGetArrayField(TEXT(
"scores"), ScoresArray))
1186 for (
const auto& ScoreValue : *ScoresArray)
1188 TSharedPtr<FJsonObject> ScoreObj = ScoreValue->AsObject();
1189 if (ScoreObj.IsValid())
1192 ScoreDetail.
score = ScoreObj->GetIntegerField(TEXT(
"score"));
1193 ScoreDetail.
desc = ScoreObj->GetStringField(TEXT(
"desc"));
1203 FString OutputString;
1204 FJsonObjectConverter::UStructToJsonObjectString(
1215 TArray<FResultStatData> StatDataList;
1220 GradeResultData.
TitleText = FText::FromString(TEXT(
"Grade"));
1222 StatDataList.Add(GradeResultData);
1227 TopRateResultData.
TitleText = FText::FromString(TEXT(
"Top"));
1229 StatDataList.Add(TopRateResultData);
1234 AverageScoreResultData.
TitleText = FText::FromString(TEXT(
"Score"));
1237 StatDataList.Add(AverageScoreResultData);
1239 return StatDataList;
1244 return FString::Printf(TEXT(
"%s\n[%s]"), *
eng, *
kor);
1253 if (!Response.IsValid())
1258 FString JsonString = Response->GetContentAsString();
1259 TSharedPtr<FJsonObject> JsonObject;
1260 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
1262 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
1264 index = JsonObject->GetIntegerField(TEXT(
"index"));
1265 difficulty = JsonObject->GetIntegerField(TEXT(
"difficulty"));
1266 room_id = JsonObject->GetIntegerField(TEXT(
"room_id"));
1269 const TArray<TSharedPtr<FJsonValue>>* QuestionArray;
1270 if (JsonObject->TryGetArrayField(TEXT(
"audio"), QuestionArray))
1272 for (
const auto& Item : *QuestionArray)
1274 TSharedPtr<FJsonObject> AudioObj = Item->AsObject();
1275 if (AudioObj.IsValid())
1278 QuestionItem.
kor = AudioObj->GetStringField(TEXT(
"kor"));
1279 QuestionItem.
eng = AudioObj->GetStringField(TEXT(
"eng"));
1280 QuestionItem.
pronunciation = AudioObj->GetStringField(TEXT(
"pronunciation"));
1282 FString tmp_audio_data;
1283 JsonObject->TryGetStringField(TEXT(
"voice_data"), tmp_audio_data);
1284 FBase64::Decode(tmp_audio_data, QuestionItem.
voice_data);
1297 FString OutputString;
1298 FJsonObjectConverter::UStructToJsonObjectString(
1313 if (!Response.IsValid())
1318 FString JsonString = Response->GetContentAsString();
1319 TSharedPtr<FJsonObject> JsonObject;
1320 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
1322 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
1325 if (JsonObject->HasTypedField<EJson::Object>(TEXT(
"total_result")))
1327 TSharedPtr<FJsonObject> TotalResultObj = JsonObject->GetObjectField(TEXT(
"total_result"));
1328 if (TotalResultObj.IsValid())
1337 const TArray<TSharedPtr<FJsonValue>>* ScenarioResultsArray;
1338 if (JsonObject->TryGetArrayField(TEXT(
"scenario_results"), ScenarioResultsArray))
1340 for (
const auto& Item : *ScenarioResultsArray)
1342 TSharedPtr<FJsonObject> ScenarioObj = Item->AsObject();
1343 if (ScenarioObj.IsValid())
1348 FString ScenarioTypeStr = ScenarioObj->GetStringField(TEXT(
"scenario_type"));
1349 if (ScenarioTypeStr == TEXT(
"READING"))
1351 else if (ScenarioTypeStr == TEXT(
"LISTENING"))
1353 else if (ScenarioTypeStr == TEXT(
"WRITING"))
1355 else if (ScenarioTypeStr == TEXT(
"SPEAKING"))
1359 ScenarioItem.
display_name = ScenarioObj->GetStringField(TEXT(
"display_name"));
1362 ScenarioItem.
final_score = ScenarioObj->GetIntegerField(TEXT(
"final_score"));
1365 ScenarioItem.
grade = ScenarioObj->GetStringField(TEXT(
"grade"));
1368 if (ScenarioObj->HasTypedField<EJson::Object>(TEXT(
"feedback_summary")))
1370 TSharedPtr<FJsonObject> FeedbackObj = ScenarioObj->GetObjectField(TEXT(
"feedback_summary"));
1371 if (FeedbackObj.IsValid())
1379 ScenarioItem.
action_item = ScenarioObj->GetStringField(TEXT(
"action_item"));
1390 FString OutputString;
1391 FJsonObjectConverter::UStructToJsonObjectString(
1407 if (!Response.IsValid())
1412 FString JsonString = Response->GetContentAsString();
1413 TSharedPtr<FJsonObject> JsonObject;
1414 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
1416 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
1418 if (JsonObject->HasField(TEXT(
"question")))
1420 question = JsonObject->GetStringField(TEXT(
"question"));
1423 if (JsonObject->HasField(TEXT(
"answer")))
1425 answer = JsonObject->GetStringField(TEXT(
"answer"));
1442 if (!Response.IsValid())
1447 FString JsonString = Response->GetContentAsString();
1448 TSharedPtr<FJsonObject> JsonObject;
1449 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);
1451 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
1453 if (JsonObject->HasField(TEXT(
"question")))
1455 question = JsonObject->GetStringField(TEXT(
"question"));
1458 if (JsonObject->HasField(TEXT(
"answer")))
1460 answer = JsonObject->GetStringField(TEXT(
"answer"));
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define NETWORK_LOG(fmt,...)
네트워크 요청과 응답에 사용되는 구조체 및 설정을 정의합니다.
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
static FLinearColor GetRankColor(float InScore)
static EResourceTextureType ConvertGradeString(const FString &Grade)
Listen 퀘스트의 개별 점수 상세 정보를 담는 구조체입니다.
FString ToRichTextString(int32 Index) const
bool IsValid() const
구조체 값이 유효한지 여부를 반환합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< FWriteQuestionData > question
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
Read 퀘스트의 개별 점수 상세 정보를 담는 구조체입니다.
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.
TArray< FInterviewAnswerData > answer
TArray< int32 > wrong_idx
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.
TArray< int32 > wrong_idx
TArray< int32 > wrong_idx
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.
TArray< int32 > wrong_idx
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
FTotalResult total_result
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FScenarioResult > scenario_results
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
void PrintData()
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FInterviewQuestionData > Questions
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< uint8 > audio_base64
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FListenScoreDetail > scores
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< FString > GetWord1List() const
FScenarioTargetData GetCorrectAnswerData() const
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FString > GetWord2List() const
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< uint8 > voice_data
TArray< FScenarioTargetData > target_data
int32 correct_answer_index
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< FReadScoreDetail > scores
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
FScenarioTargetData GetCorrectAnswerData() const
int32 correct_answer_index
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< FString > GetWord2List() const
TArray< FScenarioTargetData > target_data
TArray< FString > GetWord1List() const
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
TArray< FSpeakScoreDetail > scores
TArray< FResultStatData > GetResultStatData() const
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FSpeakStageQuestion > speak_quest_data
오디오 질문 목록
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FResultStatData > GetResultStatData() const
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
FLinearColor GetChatProfileBg(int player_index) const
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
EResourceTextureType GetChatProfileTextureType(int player_index) const
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
TArray< FResponseWriteScores > scores
Write 최종 결과 점수 정보 구조체입니다.
TArray< FResponseWriteData > ResponseWriteDataArray
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
Result Stat 위젯 통합 데이터 구조 위젯 타입, 색상 스타일, 각 타입별 데이터를 통합 관리
EResourceTextureType SymbolTextureType
Symbol 타입 전용: 심볼 문자열
FLinearColor ScoreTextColor
float RatePercent
Rate 타입 전용: 퍼센트 값 (0.0 ~ 1.0)
EColorStyleType ColorType
색상 스타일
EResultItemWidgetType WidgetType
위젯 타입
EResourceTextureType GradeTextureType
Grade 타입 전용: 텍스처 타입
float ScoreValue
Score 타입 전용: 점수 값
FFeedbackSummary feedback_summary
EScenarioType scenario_type
Speak 퀘스트의 개별 점수 상세 정보를 담는 구조체입니다.
SpeakQuest 오디오 질문 데이터 구조체입니다.
FString GetQuestionMessage() const
TArray< uint8 > voice_data
음성 데이터 Base64
FString pronunciation
발음 가이드
TArray< FPhonemeData > GetPhonemeData() const