UE4 JSON封装和解析

前提:JSON的封装和解析只适合UE4平台

构造JSON普通数组

FString Grades = "test";
TArray<FString> Name;
Name.Add("zhangsan");
Name.Add("lisi");
Name.Add("wangwu");

FString JsonOutString;
TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory< TCHAR, TCondensedJsonPrintPolicy<TCHAR> >::Create(&JsonOutString);

Writer->WriteObjectStart();            
Writer->WriteValue(L"grades", Grades);   
Writer->WriteValue(L"member", Name); //普通数组
Writer->WriteObjectEnd();             
Writer->Close();

//print
UE_LOG(LogNet,Log,TEXT("====:%s"),*JsonOutString);

解析JSON普通数组

FString command = TEXT("{\"grades\":\"test\",\"member\":[\"zhangsan\",\"lisi\",\"wangwu\"]}");

FString grades;
TArray<FString> member;

TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(command);
TSharedPtr<FJsonObject> rRoot;
bool bSuccessful = FJsonSerializer::Deserialize(Reader, rRoot);
if (bSuccessful) {
	if (rRoot->HasField(TEXT("grades"))) {
		grades = rRoot->GetStringField(TEXT("grades"));
	}

	const TArray< TSharedPtr<FJsonValue> >* members;
	if (rRoot->TryGetArrayField(TEXT("member"), members)) {
		for (int32 i = 0; i < (*members).Num(); ++i) {
				member.Add((*members)[i]->AsString());
			}
	}
}

UE_LOG(LogNet,Log,TEXT("grades:%s"),*grades);
for (int i = 0; i < member.Num(); ++i) {
	UE_LOG(LogNet, Log, TEXT("====:%s"), *member[i]);
}

构造JSON对象数组

struct Info {
		FString name;
		int age;
};

FString Class = "test";
TArray<struct Info> Name;
struct Info info;
info.name = TEXT("zhangsan");
info.age = 18;
Name.Add(info);
info.name = TEXT("lisi");
info.age = 19;
Name.Add(info);
info.name = TEXT("wangwu");
info.age = 20;
Name.Add(info);

FString JsonOutString;
TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory< TCHAR, TCondensedJsonPrintPolicy<TCHAR> >::Create(&JsonOutString);

Writer->WriteObjectStart();            //JSON对象开始
Writer->WriteValue(L"class", Class);   //JSON对象普通成员

Writer->WriteArrayStart(L"member");    //JSON对象数组成员开始
for (int32 i = 0; i < Name.Num(); ++i)
{
	Writer->WriteObjectStart();        
	Writer->WriteValue(L"name", Name[i].name);
	Writer->WriteValue(L"age", Name[i].age);
	Writer->WriteObjectEnd();          
}
Writer->WriteArrayEnd();               //JSON对象数组成员结束
Writer->WriteObjectEnd();              //JSON对象结束
Writer->Close();

//print
UE_LOG(LogNet,Log,TEXT("====:%s"),*JsonOutString);

 

解析JSON对象数组

struct Info{
        FString name;
	    int age;
};
  
FString command = TEXT("{\"grades\":\"test\",\"member\":[{\"name\":\"zhangsan\",\"age\":\"18\"},{\"name\":\"lisi\",\"age\":\"19\"},{\"name\":\"wangwu\",\"age\":\"20\"}]}");

FString grades;
TArray<Info> member;

TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(command);
TSharedPtr<FJsonObject> rRoot;
bool bSuccessful = FJsonSerializer::Deserialize(Reader, rRoot);
if (bSuccessful){
    if( rRoot->HasField(TEXT("grades")) ){
		 grades = rRoot->GetStringField(TEXT("grades"));
    }
	
    const TArray< TSharedPtr<FJsonValue> >* members;
	if( rRoot->TryGetArrayField(TEXT("member"),members) ){
	    for(int32 i = 0;i < (*members).Num();++i){
	        TSharedPtr<FJsonObject> jsonMember = (*members)[i]->AsObject();
		    struct Info person;
		    person.name = jsonMember->GetStringField(TEXT("name"));
		    person.age = jsonMember->GetIntegerField(TEXT("age"));
		    member.Add(person);
		}
	 }
}	

//print
UE_LOG(LogNet,Log,TEXT("grades = %s"),*grades);
for (int i = 0; i < member.Num(); ++i) {
	UE_LOG(LogNet, Log, TEXT("%s %d"), *member[i].name,member[i].age);
}

 

附加:

	struct Info {
		FString name;
		int age;
	};

	FString command = TEXT("{\"NO:\":{\"AAA\":\"aaa\",\"BBB\":\"bbb\",\"CCC\":{\"DDD\":\"ddd\"}},\"grades\":\"test\",\"member\":[{\"name\":\"zhangsan\",\"age\":\"18\"},{\"name\":\"lisi\",\"age\":\"19\"},{\"name\":\"wangwu\",\"age\":\"20\"}]}");

	FString grades;
	TArray<Info> member;

	TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(command);
	TSharedPtr<FJsonValue> rRoot; //注意
	bool bSuccessful = FJsonSerializer::Deserialize(Reader, rRoot);
	if (bSuccessful) {
        //方法一
		TSharedPtr<FJsonValue> aa = rRoot->AsObject()->GetField<EJson::Object>(TEXT("NO:"));
		FString a = aa->AsObject()->GetStringField(TEXT("AAA"));
		FString b = aa->AsObject()->GetStringField(TEXT("BBB"));
		UE_LOG(LogNet, Log, TEXT("a = %s,b = %s"), *a, *b);
		TSharedPtr<FJsonValue> cc = aa->AsObject()->GetField<EJson::Object>(TEXT("CCC"));
		FString d = cc->AsObject()->GetStringField(TEXT("DDD"));
		UE_LOG(LogNet, Log, TEXT("d = %s"), *d);

		//方法二
		TSharedPtr<FJsonObject> aa = rRoot->AsObject()->GetObjectField(TEXT("NO:"));//将FJsonValue对象转成FJsonObject
		FString a = aa->GetStringField(TEXT("AAA"));
		FString b = aa->GetStringField(TEXT("BBB"));
		UE_LOG(LogNet, Log, TEXT("a = %s,b = %s"), *a, *b);
		TSharedPtr<FJsonObject> cc = aa->GetObjectField(TEXT("CCC"));
		FString d = cc->GetStringField(TEXT("DDD"));
		UE_LOG(LogNet, Log, TEXT("d = %s"), *d);

		TSharedPtr<FJsonValue> priceValue = rRoot->AsObject()->GetField<EJson::String>(TEXT("grades"));
		grades = priceValue->AsString();


		TSharedPtr<FJsonValue> memberobj = rRoot->AsObject()->GetField<EJson::Array>(TEXT("member"));
		const TArray<TSharedPtr<FJsonValue> > members = memberobj->AsArray();
		for (int32 i = 0; i < members.Num(); ++i) {
			TSharedPtr<FJsonValue> jsonMember = members[i];
			struct Info person;
			person.name = jsonMember->AsObject()->GetStringField(TEXT("name"));
			person.age = jsonMember->AsObject()->GetIntegerField(TEXT("age"));
			member.Add(person);
		}

	}

	//print
	UE_LOG(LogNet, Log, TEXT("grades = %s"), *grades);
	for (int i = 0; i < member.Num(); ++i) {
		UE_LOG(LogNet, Log, TEXT("%s %d"), *member[i].name, member[i].age);
	}

分析:FJsonObject和FJsonValue区别?

先看定义

FJsonObject:

A Json Object is a structure holding an unordered set of name/value pairs.
In a Json file, it is represented by everything between curly braces {}.

FJsonValue:

A Json Value is a structure that can be any of the Json Types.

有定义可以知道,FJsonObject是有{}包含的JSON数据,FJsonValue是任何的JSON值数据类型。所以

FJsonValue类型(包括[]数据和{}对象) > FJsonObject类型({}对象)

 

上面附加的例子也可以用FJsonObject来做,如下:

	struct Info {
		FString name;
		int age;
	};

	FString command = TEXT("{\"NO\":{\"AAA\":\"aaa\",\"BBB\":\"bbb\",\"CCC\":{\"DDD\":\"ddd\"}},\"grades\":\"test\",\"member\":[{\"name\":\"zhangsan\",\"age\":\"18\"},{\"name\":\"lisi\",\"age\":\"19\"},{\"name\":\"wangwu\",\"age\":\"20\"}]}");

	FString grades;
	TArray<Info> member;

	TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(command);
	TSharedPtr<FJsonObject> rRoot; //注意
	bool bSuccessful = FJsonSerializer::Deserialize(Reader, rRoot);
	if (bSuccessful) {
		//方法一
		TSharedPtr<FJsonObject> aa = rRoot->GetObjectField(TEXT("NO"));
		FString a = aa->GetStringField(TEXT("AAA"));
		FString b = aa->GetStringField(TEXT("BBB"));
		UE_LOG(LogNet, Log, TEXT("a = %s,b = %s"), *a, *b);
        TSharedPtr<FJsonObject> cc = aa->GetObjectField(TEXT("CCC"));
		FString d = cc->GetStringField(TEXT("DDD"));
		UE_LOG(LogNet, Log, TEXT("d = %s"), *d);

		//方法二
		TSharedPtr<FJsonValue> aa2 = rRoot->GetField<EJson::Object>(TEXT("NO")); //将FJsonObject对象转成FJsonValue
		FString a2 = aa2->AsObject()->GetStringField(TEXT("AAA"));
		FString b2 = aa2->AsObject()->GetStringField(TEXT("BBB"));
		UE_LOG(LogNet, Log, TEXT("a2 = %s,b2 = %s"), *a2, *b2);
		TSharedPtr<FJsonObject> cc2 = aa2->AsObject()->GetObjectField(TEXT("CCC"));
		FString d2 = cc2->GetStringField(TEXT("DDD"));
		UE_LOG(LogNet, Log, TEXT("d2 = %s"), *d2);

	    grades = rRoot->GetStringField(TEXT("grades"));

		TSharedPtr<FJsonValue> MemberValue = rRoot->GetField<EJson::Array>(TEXT("member"));
		const TArray<TSharedPtr<FJsonValue> > members = MemberValue->AsArray();
		for (int32 i = 0; i < members.Num(); ++i) {
			TSharedPtr<FJsonValue> jsonMember = members[i];
			struct Info person;
			person.name = jsonMember->AsObject()->GetStringField(TEXT("name"));
			person.age = jsonMember->AsObject()->GetIntegerField(TEXT("age"));
			member.Add(person);
		}

	}

	//print
	UE_LOG(LogNet, Log, TEXT("grades = %s"), *grades);
	for (int i = 0; i < member.Num(); ++i) {
		UE_LOG(LogNet, Log, TEXT("%s %d"), *member[i].name, member[i].age);
	}

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
UE4中使用Json文件进行数据的读取和写入相对比较简单。下面将以C++代码为例说明: 1. 读取Json文件: 首先需要引入Json库的头文件: ```cpp #include "Json.h" #include "JsonUtilities.h" ``` 然后使用FFileHelper::LoadFileToString函数来将Json文件加载为字符串: ```cpp FString JsonStr; FFileHelper::LoadFileToString(JsonStr, TEXT("文件路径")); ``` 接下来使用FJsonUtilities::JsonStringToValue函数将字符串转化为Json对象: ```cpp TSharedPtr<FJsonObject> JsonObj; TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonStr); if (FJsonSerializer::Deserialize(JsonReader, JsonObj)) { // 读取Json对象中的数据 // 例如:JsonObj->GetStringField("字段名称") 获取字符串字段的值 } ``` 2. 写入Json文件: 创建一个Json对象,并给它赋值: ```cpp TSharedPtr<FJsonObject> JsonObj = MakeShareable(new FJsonObject); JsonObj->SetStringField("字段名称", "字段值"); ``` 将Json对象序列化为字符串: ```cpp FString JsonStr; TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<TCHAR>::Create(&JsonStr); FJsonSerializer::Serialize(JsonObj.ToSharedRef(), JsonWriter); JsonWriter->Close(); ``` 使用FFileHelper::SaveStringToFile函数将字符串写入到文件: ```cpp FFileHelper::SaveStringToFile(JsonStr, TEXT("文件路径")); ``` 以上就是使用UE4进行Json文件的读取和写入的简单步骤。根据具体需求,你可以根据Json的对象结构和字段类型进行相应的数据读取和写入操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值