{ "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类,我用它来从Blueprints调用这些函数.
这一切都很好,但是当我尝试从二级读取东西时,事情就不起作用了.
我编写了这段代码来提升下一级别:
TSharedPtr<FJsonObject> nested = storedJSON->GetobjectField(key);
nested->GetStringField(anotherKey); //nothing
所以,例如,使用上面的JSON,这个:
TSharedPtr<FJsonObject> nested = storedJSON->GetobjectField("player1"); FString alias = nested->GetStringField("alias");
当我将其打印到控制台时,别名没有任何价值.
难道我做错了什么?为什么二级JSON不起作用?
解决方法
FJsonObjectConverter :: JsonObjectStringToUStruct
这是docs和UE4 AnswerHub回答的另一个问题
基本上,您创建目标USTRUCT(或嵌套JSON的USTRUCT),使用UPROPERTY标记所有属性,因此Unreal知道它们的名称,并使用此函数.它将通过匹配它们来复制值.它甚至复制阵列! = d
例
我将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);
现在,您可以像标准C结构一样访问所有属性.例如,访问其中一个barfoos:
FString barfoo0 = JsonData.bar_arr[0].barfoo;
我没有使用int和float在JSON中测试它,但由于它复制了偶数数组,我相信它也可以工作.
原文地址:https://www.jb51.cc/c/111469.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。