前提: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);
}