准备条件

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 数据的更多相关文章

  1. Qt平台下使用QJson解析和构建JSON字符串

    前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...

  2. 使用cJSON库解析和构建JSON字符串

    使用cJSON库解析和构建JSON字符串 前言 其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON: 使用cJSON库解析JSON JSON简介 当时在MCU平台上使用时,会 ...

  3. Gson解析复杂的json数据

    最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的json解析方法即JsonObject ...

  4. 如何构建JSON数据,JSON数据的格式,JSON数据的获取

    假设你是用$.getJSON();方法获取JSON数据$.getJSON(url,{"Action":"getStudent"},function(data){ ...

  5. 使用Gson解析复杂的json数据

    Gson解析复杂的json数据 最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的jso ...

  6. 【转】Jquery ajax方法解析返回的json数据

    转自http://blog.csdn.net/haiqiao_2010/article/details/12653555 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返 ...

  7. hive 存储,解析,处理json数据

    hive 处理json数据总体来说有两个方向的路走 1.将json以字符串的方式整个入Hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如使用LATERAL VIEW json_tu ...

  8. Gson解析第三方提供Json数据(天气预报,新闻等)

    之前都是自己写后台,自己的server提供数据给client. 近期在看第三方的数据接口,訪问其它站点提供的信息.比方.我们可能自己收集的数据相当有限.可是网上提供了非常多关于天气预报.新闻.星座运势 ...

  9. $Java-json系列(二):用JSONObject解析和处理json数据

    本文中主要介绍JSONObject处理json数据时候的一些常用场景和方法. (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s/1c27Uyre ( ...

随机推荐

  1. elsa-core:4.ASP.NET Core Server with Elsa Dashboard

    在本快速入门中,我们将了解一个最小的 ASP.NET Core 应用程序,该应用程序承载 Elsa Dashboard 组件并将其连接到 Elsa Server. ElsaDashboard + Do ...

  2. Windows下安装Apollo时的几个常见问题

    今天在本地安装Apollo时遇到几个问题,觉得还是记录下来,希望能给有需要的朋友提供帮助. 安装的过程参考这篇教程,https://www.jianshu.com/p/6cf4b15ba82f.流程基 ...

  3. Linux串口调试详解

    测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 目标机添加串口设备 一般嵌入式主板的默认镜像可能只配置了调试串口,并用于 consol ...

  4. 这篇 Java 基础,我吹不动了

    Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章我补充了一些关于<Java基础核心总结>的内容,修改了部分错别字和语句不通顺的地方,并且对内部类.泛型等内容进 ...

  5. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现

    环境 .NET5,Consul_v1.10.2 一.简介 在微服务中利用Consul可以实现服务的注册,服务发现,治理,健康检查等. Web调站点需要调用多个服务,如果没有Consul,可能就是Web ...

  6. 在PHP中使用SPL库中的对象方法进行XML与数组的转换

    虽说现在很多的服务提供商都会提供 JSON 接口供我们使用,但是,还是有不少的服务依然必须使用 XML 作为接口格式,这就需要我们来对 XML 格式的数据进行解析转换.而 PHP 中并没有像 json ...

  7. 深入学习Composer原理(三)

    本系列第三篇文章,一起了解下PSR规范中的PSR4和PSR0规范 首先恭喜大家,包括我自己,坚持到了现在.这篇文章之后,Composer的基础原理就清晰明了咯.也就是说,Composer所利用的正是s ...

  8. 网站URL Rewrite(伪静态)设置方法

    1.如果您的服务器支持.htaccess,则无需设置,网站根目录下的.htaccess已经设置好规则.规则详情:http://download.destoon.com/rewrite/htaccess ...

  9. Linux系列(29) - rpm包命名规则(1)

    RPM包命名规则 例如包名:httpd-2.2.15-15.el6.centsos.1.i686.rpm 软件包名-httpd 软件版本-2.2.15 发布的次数-15 el6.centos适合的Li ...

  10. 我是小白,做PPT像流水账,怎么做一份重点突出的PPT?

    1.PPT的封面不要只写标题,还要在显眼的位置写上你的核心观点.比如,你之前做的PPT封面标题是<A产品市场前景分析>,现在不妨加上一个副标题<红海市场中需要找到更多本产品卖点> ...