Я использую UE 5.3. У меня есть переменная UPROPERTY с именем «тип проблемы». При сериализации с использованием FJsonObjectConverter::UStructToJsonObject создается «issueType». Это происходит только в пакетных сборках, а не при работе в PIE.
Глядя на FJsonObjectConverter::StandardizeCase, он делает только первый символ или букву "d" в "ID" строчными буквами, поэтому я не могу понять, почему он использует заглавную букву T в типе проблемы, не говоря уже о том, почему он делает это только в упакованные сборки, а не PIE. Если он каким-то образом идентифицирует составные слова, я использую другие сложные слова, с которыми он этого не делает, например «настраиваемое поле».
Вот мой код:
структура:
USTRUCT()
struct FMyIssue
{
GENERATED_BODY()
public:
FMyIssue() = default;
UPROPERTY()
TMap<FString, FString> issuetype = {{TEXT("name"), TEXT(" ") }};
}
.cpp
TSharedPtr<FMyStruct> myStruct = MakeShared<FMyStruct>();
TSharedPtr<FJsonObject> jsonObject = FJsonObjectConverter::UStructToJsonObject(*myStruct);
FString serializedSelf;
const TSharedRef<TJsonWriter<>> jsonWriter = TJsonWriterFactory<>::Create(&serializedSelf);
FJsonSerializer::Serialize(jsonObject .ToSharedRef(), jsonWriter)
const FString fileLocation = TEXT("path/to/file");
FFileHelper::SaveStringToFile(serializedSelf, *fileLocation)
выход:
{
"issueType":
{
"name": " "
},
}

Я извлекаю значение из ключа конфигурации INI с именем IssueType. Я установил для каждого экземпляра типа проблемы строчные буквы, и это решило проблему. Я не понимаю, как и почему, но это произошло.
.ini перед строчными буквами
[IssueType]
IssueType = myissue
cpp
_issuetype = GConfig->GetStr(TEXT("IssueType"), TEXT("IssueType"), configFile);
myIssue->issuetype[TEXT("name")] = GetDefault<UMySettings>()->_issuetype;
FJsonObjectConverter Unreal использует имена (FName) для ключей JSON, и у них есть известная проблема с сохранением регистра:
https://medium.com/@pbrooks_uk/unreal-fname-non-preserved-case-sensitivitiy-b0ecf84b99d3
По сути, если в вашем проекте есть две переменные FName:
FName TitleCaseName(L"MyActivity");
FName camelCaseName(L"myactivity");
тогда TitleCaseName.ToString() и camelCaseName.ToString() вернут одну и ту же строку: «myactivity» или «MyActivity» (и трудно или невозможно предсказать, какая именно).
Я считаю это фундаментальным недостатком реализации FJsonObjectConverter. Возможно, вам лучше использовать FJsonObject напрямую или встроить сторонний парсер JSON, например sajson