【UE4 C++】 解析与构建 Json 数据
准备条件
Json 格式
{
"Players":[
{
"Name": "Player1",
"health": 200,
"icon": "Texture2D'/Game/FourEvilDragonsHP/Textures/DragonTheUsurper/BlueHPTex.BlueHPTex'"
},
{
"Name": "Player2",
"health": 90,
"icon": "Texture2D'/Game/FourEvilDragonsHP/Textures/DragonTheSoulEater/BlueHPTex.BlueHPTex'"
},
{
"Name": "Player3",
"health": 150,
"icon": "None"
}
]
}
UE4 添加Json模块
Build.cs中将Json模块导入
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Json" });
数据说明
FJsonObject
表示一个Json对象,可以作为值 嵌套
读取数据相关节点
TSharedPtr<FJsonValue> TryGetField( const FString& FieldName ) bool HasField( const FString& FieldName) double GetNumberField(const FString& FieldName)
int32 GetIntegerField(const FString& FieldName) bool TryGetNumberField(const FString& FieldName, double& OutNumber)
bool TryGetNumberField(const FString& FieldName, int32& OutNumber)
bool TryGetNumberField(const FString& FieldName, uint32& OutNumber)
bool TryGetNumberField(const FString& FieldName, int64& OutNumber) FString GetStringField(const FString& FieldName)
bool TryGetStringField(const FString& FieldName, FString& OutString)
bool TryGetStringArrayField(const FString& FieldName, TArray<FString>& OutArray) bool TryGetEnumArrayField(const FString& FieldName, TArray<TEnum>& OutArray) bool GetBoolField(const FString& FieldName)
bool TryGetBoolField(const FString& FieldName, bool& OutBool) const TArray< TSharedPtr<FJsonValue> >& GetArrayField(const FString& FieldName)
bool TryGetArrayField(const FString& FieldName, const TArray< TSharedPtr<FJsonValue> >*& OutArray) const TSharedPtr<FJsonObject>& GetObjectField(const FString& FieldName)
bool TryGetObjectField(const FString& FieldName, const TSharedPtr<FJsonObject>*& OutObject)
存储数据的节点
void SetField( const FString& FieldName, const TSharedPtr<FJsonValue>& Value ) void RemoveField(const FString& FieldName); void SetNumberField( const FString& FieldName, double Number ) void SetStringField( const FString& FieldName, const FString& StringValue ) void SetBoolField( const FString& FieldName, bool InValue ) void SetArrayField( const FString& FieldName, const TArray< TSharedPtr<FJsonValue> >& Array ) void SetObjectField( const FString& FieldName, const TSharedPtr<FJsonObject>& JsonObject )
FJsonValue
读取 Json 数据
本地读取
注意 JsonReader 的类型
TSharedRef<TJsonReader<>>,使用TJsonReaderFactory<>::Create创建使用 FJsonSerializer::Deserialize 将 Json String 转成 JsonObject
FJsonValue 可以再度转化城成FJsonObject,或者直接提取 基本类型数据
FString JsonPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo.json");
JsonPath = FPaths::ConvertRelativePathToFull(JsonPath);
if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*JsonPath))
{
UKismetSystemLibrary::PrintString(GetWorld(), *JsonPath);
FString JsonData;
FFileHelper::LoadFileToString(JsonData, *JsonPath); // FString 转 JsonObj
TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(JsonData);
TSharedPtr<FJsonObject> RootJsonObj = MakeShareable(new FJsonObject);
if (FJsonSerializer::Deserialize(JsonReader, RootJsonObj))
{
UE_LOG(LogTemp, Warning, TEXT("JsonData:%s"), *JsonData );
const TArray< TSharedPtr<FJsonValue> >* members;
if (RootJsonObj->TryGetArrayField(TEXT("Players"),members))
{
for (TSharedPtr<FJsonValue> item: * members)
{
TSharedPtr<FJsonObject>itemObjet = item->AsObject();
UE_LOG(LogTemp, Warning, TEXT("name:%s health:%d"), *itemObjet->GetStringField(TEXT("Name")),itemObjet->GetIntegerField(TEXT("health")) );
}
}
}
else
UKismetSystemLibrary::PrintString(GetWorld(), TEXT("FJsonSerializer::Deserialize Failed!"));
}

网络读取 Json
- 与本地类似,但是通过 URL 获取 Json 数据
- 可以使用 VaRest 插件,支持读写
写入 Json 数据
基本类型构造 Json 数据
注意 Write 类型为 TSharedRef<TJsonWriter<>>,使用
TJsonWriterFactory<>::Create()创建步骤
- WriteObjectStart
- WriteValue 普通字段
- 数组字段
- WriteArrayStart
- WriteObjectStart
- WriteValue (可以多个字段)
- WriteObjectEnd
- WriteArrayEnd
- WriteObjectEnd
- Close();
代码实现
struct Info {
FString name;
int32 health;
}; FString InfoCategory = "Player State";
TArray<Info> Players;
struct Info info; info.name = TEXT("城主"); info.health = 30; Players.Add(info); info.name = TEXT("白月魁"); info.health = 200; Players.Add(info); info.name = TEXT("临渊者"); info.health = 999; Players.Add(info); FString OutJsonData;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJsonData);
//TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory< TCHAR, TCondensedJsonPrintPolicy<TCHAR> >::Create(&OutJsonData); Writer->WriteObjectStart(); // JSON对象开始
Writer->WriteValue(L"category", InfoCategory); // 填充普通字段 Writer->WriteArrayStart(L"players"); // Json 数组字段开始
for (Info player : Players)
{
Writer->WriteObjectStart();
Writer->WriteValue(L"name", player.name); // 填充普通字段
Writer->WriteValue(L"health", player.health); // 填充普通字段
Writer->WriteObjectEnd();
}
Writer->WriteArrayEnd(); // Json 数组字段结束
Writer->WriteObjectEnd(); //JSON对象结束
Writer->Close(); UE_LOG(LogTemp, Warning, TEXT("JsonData:%s"), *OutJsonData );

FJsonObject 构造 Json 数据
主要 FJsonObject 转 JsonValue
FJsonSerializer::Serialize 将 FJsonObject 转 FString
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
TArray<TSharedPtr<FJsonValue>> PlayersData; TSharedPtr<FJsonObject> Player1 = MakeShareable(new FJsonObject);
Player1->SetStringField(TEXT("name"), TEXT("城主"));
Player1->SetNumberField(TEXT("health"), 30);
Player1->SetStringField(TEXT("icon"), TEXT(""));
PlayersData.Add(MakeShareable(new FJsonValueObject(Player1))); TSharedPtr<FJsonObject> Player2 = MakeShareable(new FJsonObject);
Player2->SetStringField(TEXT("name"), TEXT("白月魁"));
Player2->SetNumberField(TEXT("health"), 200);
Player2->SetStringField(TEXT("icon"), TEXT(""));
PlayersData.Add(MakeShareable(new FJsonValueObject(Player2))); TSharedPtr<FJsonObject> Player3 = MakeShareable(new FJsonObject);
Player3->SetStringField(TEXT("name"), TEXT("临渊者"));
Player3->SetNumberField(TEXT("health"), 999);
Player3->SetStringField(TEXT("icon"), TEXT(""));
PlayersData.Add(MakeShareable(new FJsonValueObject(Player3))); JsonObject->SetArrayField(TEXT("players"), PlayersData); FString OutJsonData;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJsonData);
FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); UE_LOG(LogTemp, Warning, TEXT("JsonData:%s"), *OutJsonData );
参考
【UE4 C++】 解析与构建 Json 数据的更多相关文章
- Qt平台下使用QJson解析和构建JSON字符串
前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...
- 使用cJSON库解析和构建JSON字符串
使用cJSON库解析和构建JSON字符串 前言 其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON: 使用cJSON库解析JSON JSON简介 当时在MCU平台上使用时,会 ...
- Gson解析复杂的json数据
最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的json解析方法即JsonObject ...
- 如何构建JSON数据,JSON数据的格式,JSON数据的获取
假设你是用$.getJSON();方法获取JSON数据$.getJSON(url,{"Action":"getStudent"},function(data){ ...
- 使用Gson解析复杂的json数据
Gson解析复杂的json数据 最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的jso ...
- 【转】Jquery ajax方法解析返回的json数据
转自http://blog.csdn.net/haiqiao_2010/article/details/12653555 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返 ...
- hive 存储,解析,处理json数据
hive 处理json数据总体来说有两个方向的路走 1.将json以字符串的方式整个入Hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如使用LATERAL VIEW json_tu ...
- Gson解析第三方提供Json数据(天气预报,新闻等)
之前都是自己写后台,自己的server提供数据给client. 近期在看第三方的数据接口,訪问其它站点提供的信息.比方.我们可能自己收集的数据相当有限.可是网上提供了非常多关于天气预报.新闻.星座运势 ...
- $Java-json系列(二):用JSONObject解析和处理json数据
本文中主要介绍JSONObject处理json数据时候的一些常用场景和方法. (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s/1c27Uyre ( ...
随机推荐
- 集合框架2- ArrayList
其实 Java 集合框架也叫做容器,主要由两大接口派生而来,一个是 collection,主要存放对象的集合.另外一个是Map, 存储着键值对(两个对象)的映射表. 下面就来说说 List接口,Lis ...
- 解决win10 cmd运行python弹出windows应用商店下python应用程序
方法一: 1.我一开始下载完python后,忘记下载到哪个位置,在win10底下输入框搜索python,点击打开文件所在位置,所在位置是python快捷键的位置,直接复制进行环境配置 配置完环境变量后 ...
- 1,Spark参数调优
Spark调优 目录 Spark调优 一.代码规范 1.1 避免创建重复RDD 1.2 尽量复用同一个RDD 1.3 多次使用的RDD要持久化 1.4 使用高性能算子 1.5 好习惯 二.参数调优 资 ...
- Selenium系列(十八) - Web UI 自动化基础实战(5)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Vue获取Abp VNext Token
Abp VNext默认没公开访问Token的Api,但有个问题Cookie方式如果是手机或桌面程序不如Token方便 Axios默认是Json方式提交,abp登录需要使用application/x-w ...
- vue-admin-element 页面跳转
1.通过router-link 进行跳转 <router-link to="/china-quotation/business-function/quotation-request&q ...
- EL-ADMIN学习笔记
一,支持接口限流,避免恶意请求导致服务层压力过大 常见的限流功能一般有两个关注点: 1.限流原则,即以什么样的条件对请求进行识别以及放行.常见的作法是给予每个调用API的系统不同的唯一编码,用于监控某 ...
- this关键字的理解
this理解为:当前对象 或 当前正在创建的对象 this代表所在类的当前对象的引用(地址值),即对象对自己的引用. 备注:意思方法被那个对象调用,方法中的this就代表那个对象.即谁调用,this就 ...
- 剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n ...
- Hadoop 2.x安装
1.关闭防火墙 systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开 ...