主要内容:
本文主要讲解在UE4中如何用Json文件实现增删查改操作 。
实现步骤:
一.新建插件以及创建C++Class
添加json模块
具体代码实现:
JsonToolSubsystem.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "JsonToolSubsystem.generated.h"
/**
*
*/
//表示建筑朝向的枚举
UENUM(BlueprintType)
enum class EOrient : uint8
{
North,
East,
South,
West,
};
//创建表示物体信息的结构体
USTRUCT(BlueprintType)
struct FBuildingInfo
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BuildingInfo")
int32 Building_ID;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BuildingInfo")
FString Building_Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BuildingInfo")
FVector Building_Location;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BuildingInfo")
EOrient Orientation;
};
//创建表示所有建筑信息的结构体
USTRUCT(BlueprintType)
struct FAllBuildingInfo
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BuildingInfo")
TArray<FBuildingInfo> BuildingInfo;
};
UCLASS()
class JSONTOOLS_API UJsonToolSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
public:
//init
UFUNCTION(BlueprintCallable, Category = "ReadJsonFile")
bool Init(const FString& Filename);
//Read Json
UFUNCTION(BlueprintCallable, Category = "ReadJsonFile")
bool ReadJson(const FString& Filename, int32 ID, FBuildingInfo& Data);
//Save Json
UFUNCTION(BlueprintCallable, Category = "ReadJsonFile")
bool SaveJson(const FString& Filename, const FBuildingInfo& Data);
//Remove Json
UFUNCTION(BlueprintCallable, Category = "ReadJsonFile")
bool RemoveJson(const FString& Filename, int32 ID);
private:
FAllBuildingInfo AllInfo;
};
JsonToolSubsystem.cpp
在这里插入代码片
```// Fill out your copyright notice in the Description page of Project Settings.
#include "JsonToolSubsystem.h"
#include "Runtime/JsonUtilities/Public/JsonObjectConverter.h"
#include <string>
bool UJsonToolSubsystem::Init(const FString& Filename)
{
FString JsonStr = "";
if (FFileHelper::LoadFileToString(JsonStr, *Filename))
{
/* 加载文件并将拿到的Json字符串转为对应结构体 */
FJsonObjectConverter::JsonObjectStringToUStruct<FAllBuildingInfo>(JsonStr, &AllInfo, 0, 0);
return true;
}
return false;
}
bool UJsonToolSubsystem::ReadJson(const FString& Filename, int32 ID, FBuildingInfo& Data)
{
if (Init(Filename) == true)
{
int32 i = 0;
//判断建筑的ID和json文件内所存储的ID是否有一致的值,如果有就把对应的结构体取出来
for (i = 0; i < AllInfo.BuildingInfo.Num(); ++i)
{
if (ID == AllInfo.BuildingInfo[i].Building_ID)
{
Data = AllInfo.BuildingInfo[i];
return true;
}
}
return false;
}
return false;
}
bool UJsonToolSubsystem::SaveJson(const FString& Filename, const FBuildingInfo& Data)
{
if (Init(Filename) == true)
{
FString JsonStr = "";
int32 i = 0;
for (i = 0; i < AllInfo.BuildingInfo.Num(); ++i)
{
//判断json文件里是否有相同ID属性的结构体,如果有则替换,没有则新增结构体元素
if (Data.Building_ID == AllInfo.BuildingInfo[i].Building_ID)
{
AllInfo.BuildingInfo[i] = Data;
FJsonObjectConverter::UStructToJsonObjectString(AllInfo, JsonStr, 0, 0);
return FFileHelper::SaveStringToFile(JsonStr, *Filename);
}
}
AllInfo.BuildingInfo.Add(Data);
FJsonObjectConverter::UStructToJsonObjectString(AllInfo, JsonStr, 0, 0);
return FFileHelper::SaveStringToFile(JsonStr, *Filename);
}
return false;
}
bool UJsonToolSubsystem::RemoveJson(const FString& Filename, int32 ID)
{
if (Init(Filename) == true)
{
FString JsonStr = "";
int32 i = 0;
for (i = 0; i < AllInfo.BuildingInfo.Num(); ++i)
{
if (ID == AllInfo.BuildingInfo[i].Building_ID)
{
AllInfo.BuildingInfo.RemoveAt(i);
FJsonObjectConverter::UStructToJsonObjectString(AllInfo, JsonStr, 0, 0);
return FFileHelper::SaveStringToFile(JsonStr, *Filename);
}
}
return false;
}
return false;
}
二、具体功能展现
ps:进行操作时切勿打开Json文件
新建json文件
1.读取
2.修改
3.增加
4.删除
三、工程文件(4.25)
链接:https://pan.baidu.com/s/1ulM8ojmKpwqTVFYBJGdA0g
提取码:6au6