虚幻引擎4中的C嵌套JSON
我有一个
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类,我用它来从Blueprints调用这些函数. 这一切都很好,但是当我尝试从二级读取东西时,事情就不起作用了. 我编写了这段代码来提升下一级别: TSharedPtr<FJsonObject> nested = storedJSON->GetObjectField(key); 但是所有获取嵌套字段的调用都没有返回. nested->GetStringField(anotherKey); //Nothing 所以,例如,使用上面的JSON,这个: TSharedPtr<FJsonObject> nested = storedJSON->GetObjectField("player1"); FString alias = nested->GetStringField("alias"); 当我将其打印到控制台时,别名没有任何价值. 难道我做错了什么?为什么二级JSON不起作用? 解决方法
不知道你是否解决了它,但我发现了一个非常讨厌的函数,适用于嵌套对象,也适用于数组.并且它为您提供了一个USTRUCT,因此您不必使用通过Keys获取值的函数(我不喜欢它们,因为它们非常容易出错).相反,你会有类型安全!
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中测试它,但由于它复制了偶数数组,我相信它也可以工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 斯坦福大学ML(7)——正则化(Regularization)
- c# – Class和Activator.CreateInstance
- 事件触摸-Quick-Cocos2dx
- Oracle数据库创建表空间及为用户指定表空间
- Flex 中Array的插入删除元素
- [Swift Weekly Contest 109]LeetCode935. 骑士拨号器 | Kni
- 使用“swiftc”命令编译swift文件时如何导入像“UIKit”这样
- 如何获得postgresql前10个值?
- 驱动模块卸载问题解决rmmod: chdir(2.6.34): No such file
- postgresql – 适用于Scala的任何中等体面的jdbc包装?