在ue4 端要生成如下的一种嵌套Json发送到服务端
{
"id":"1",
"name": "A",
"children": [
{
"id": "1588",
"name": "标高 ",
"children": [
{
"id": "-2000032",
"name": "楼板",
"children": [
{
"id": "125566",
"name": "6厚花纹钢盖板",
"children": [
{
"id": "178978",
"name": "6厚花纹钢盖板_178978",
"children": [],
}]
}]
}]
}]
}
FJsonObjectConverter::UStructToJsonObjectString
这个方法不适用于上述Json
结构,因为Children嵌套的层数是不确定的,无法定义结构体,去直接转化成json
在Json
、JsonUtilites
模块里已经提供一些很方便的方法去解析和拼接Json
创建JsonObject并设置字符串类型Field
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
JsonObject->SetStringField(TEXT("id"),*ModelId);
JsonObject->SetStringField(TEXT("name"),*SceneActor->GetName());
TSharedPtr<FJsonObject> JsonObjectN = MakeShareable(new FJsonObject);
JsonObjectN->SetStringField(TEXT("id"),*ModelId);
JsonObjectN->SetStringField(TEXT("name"),*SceneActor->GetName());
多个JsonObject可添加到一个数组
TArray<TSharedPtr<FJsonValue>> TreeLevelData;
TreeLevelData.Add(MakeShareable(new FJsonValueObject(JsonObject)));
....
TreeLevelData.Add(MakeShareable(new FJsonValueObject(JsonObjectN)));
new FJsonValueObject
的构造中的方法如下
FJsonValueObject(TSharedPtr<FJsonObject> InObject) : Value(InObject) {Type = EJson::Object;}
其中, Value
的变量类型为TSharedPtr<FJsonObject> Value
创建JsonObject并设置数组类型Field
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
JsonObject->SetArrayField(TEXT("Children"),TreeLevelData);
关键代码
TArray<TSharedPtr<FJsonValue>> UBNDataSmithTool::GetChildTreeLevelData(AActor* Actor, int Level, int Deep)
{
Level ++;
TArray<TSharedPtr<FJsonValue>> TreeLevelData;
TArray<AActor*> TempActors;
Actor->GetAttachedActors(TempActors);
for(const auto& TempActor : TempActors)
{
const TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
if(Level < Deep && (!Cast<AStaticMeshActor>(TempActor)))
{
// 递归调用,通过判断
TArray<TSharedPtr<FJsonValue>> TempTreeLevelData = GetChildTreeLevelData(TempActor,Level,Deep);
JsonObject->SetArrayField(TEXT("Children"),TempTreeLevelData);
}
FString ModelId;
if (IsValid(Cast<AStaticMeshActor>(TempActor)))
{
ModelId = *UDatasmithContentBlueprintLibrary::GetDatasmithUserDataValueForKey(TempActor, "Datasmith_UniqueId");
}
else
{
ModelId = *UDatasmithContentBlueprintLibrary::GetDatasmithUserDataValueForKey(TempActor->GetRootComponent(), "Datasmith_UniqueId");
}
JsonObject->SetStringField(TEXT("ModelId"),*ModelId);
JsonObject->SetStringField(TEXT("ModelName"),*TempActor->GetName());
TreeLevelData.Add(MakeShareable(new FJsonValueObject(JsonObject)));
}
return TreeLevelData;
}
}
最后的最后,如果您觉得这篇文章帮助到您,请资助下这位朋友的粮食,谢谢!