我有一个从服务器获取的 JSON 对象,它看起来像这样:
{
"state":"1",
"player1": {
"alias":"Player Name",
"ready":"0"
}
}
我能够获取 JSON,将其解析为 FJsonObject,并使用以下代码检索 JSON 对象的第一级中的任何数字或字符串以进行序列化:
TSharedPtr<FJsonObject> JsonParsed;
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(json);
if (FJsonSerializer::Deserialize(JsonReader, JsonParsed))
//Use JsonParsed
这段代码读取字符串:
FString AJSONContainer::getStringWithKey(FString key)
{
return storedJSON->GetStringField(key);
}
边注:
AJSONContainer 只是一个 Actor 类,我用来从蓝图中调用这些函数。
这一切都很好而且很花哨,但是当我尝试从第二层阅读内容时,事情就不起作用了。
我写了这段代码来下一个层次:
TSharedPtr<FJsonObject> nested = storedJSON->GetObjectField(key);
但是所有获取 nested
字段的调用都没有返回任何内容。
nested->GetStringField(anotherKey); //Nothing
因此,例如,对于上面的 JSON,这:
TSharedPtr<FJsonObject> nested = storedJSON->GetObjectField("player1");
FString alias = nested->GetStringField("alias");
alias
当我将它打印到控制台时没有任何价值。
难道我做错了什么?为什么二级 JSON 不起作用?
原文由 Liftoff 发布,翻译遵循 CC BY-SA 4.0 许可协议
不知道你是否把它整理好,但我发现了一个非常讨厌的函数,它适用于嵌套对象,也适用于数组。它为您提供了一个 USTRUCT,因此您不必使用通过键获取值的函数(我不喜欢它们,因为它们很容易出错)。相反,您将拥有类型安全性!
FJsonObjectConverter::JsonObjectStringToUStruct
这是 UE4 AnswerHub 上回答的 文档 和另一个问题
基本上,您创建目标 USTRUCT(或嵌套 JSON 的 USTRUCT),用 UPROPERTY 标记所有属性,以便 Unreal 知道它们的名称,然后使用此函数。它将通过匹配来复制这些值。它甚至复制数组! =D
例子
我将 JSON FString 称为反序列化 Json ,它的结构如下所示。它包含一个嵌套对象和一个数组,使事情变得有趣。
在转换之前,我们需要从内到外创建 USTRUCT(因此我们可以在外部引用内部)。请记住始终使用 F 作为结构名称。
转换将如下所示:
现在,您可以像在标准 C++ 结构中一样访问所有属性。例如,要访问 barfoo 之一:
我没有在 JSON 中使用 int 和 float 对其进行测试,但由于它甚至复制数组,我相信这也可以。