不知道你是否已经解决了,但我发现了一个非常讨厌的函数,它适用于嵌套对象,也适用于数组。它给你一个 USTRUCT,所以你不必使用通过 Keys 获取值的函数(我不喜欢它们,因为它们很容易出错)。相反,您将拥有类型安全!
FJsonObjectConverter::JsonObjectStringToUStruct
这里有docs https://docs.unrealengine.com/latest/INT/API/Runtime/JsonUtilities/FJsonObjectConverter/JsonObjectStringToUStruct/index.html另一个问题的回答UE4 应答中心 https://answers.unrealengine.com/questions/21011/how-do-i-properly-utilize-jsonobjectstringtoustruc.html
基本上,您创建目标 USTRUCT(或嵌套 JSON 的 USTRUCT),用 UPROPERTY 标记所有属性,以便 Unreal 知道它们的名称,并使用此函数。它将通过匹配值来复制这些值。它甚至复制数组! =D
Example
我将调用 JSON FString 进行反序列化Json它的结构如下所示。它包含一个嵌套对象和一个数组,使事情变得有趣。
{
"nested" : {
"id" : "654asdf",
"name" : "The Name"
},
"foo" : "foobar",
"bar_arr" : [
{ "barfoo" : "asdf" },
{ "barfoo" : "qwer" }
]
}
在转换之前,我们需要从内到外创建 USTRUCT(这样我们就可以在外部引用内部)。请记住始终使用F对于结构名称。
USTRUCT()
struct FNested
{
GENERATED_USTRUCT_BODY()
UPROPERTY()
FString id;
UPROPERTY()
FString name;
};
USTRUCT()
struct FBar
{
GENERATED_USTRUCT_BODY()
UPROPERTY()
FString barfoo;
};
USTRUCT()
struct FJsonData
{
GENERATED_USTRUCT_BODY()
UPROPERTY()
FNested nested;
UPROPERTY()
FString foo;
UPROPERTY()
TArray<FBar> bar_arr;
};
转换将如下所示:
FJsonData JsonData;
FJsonObjectConverter::JsonObjectStringToUStruct<FJsonData>(
Json,
&JsonData,
0, 0);
现在,您可以像标准 C++ 结构中一样访问所有属性。例如,要访问其中之一barfoos:
FString barfoo0 = JsonData.bar_arr[0].barfoo;
我还没有在 JSON 中使用 int 和 float 测试它,但由于它甚至复制数组,我相信这也可以工作。