Имя переменной UE5 UPROPERTY сериализуется с использованием верблюжьего регистра с помощью FJsonObjectConverter::UStructToJsonObject

Я использую 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": " "
        },
}
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
158
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я извлекаю значение из ключа конфигурации 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

Другие вопросы по теме