USTRUCT(BlueprintType) struct FPlaceInfo { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Struct) int Id; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Struct) FString Name; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Struct) FTransform Transform; }; void UMapBlueprintFunctionLibrary::ExportJson(TArray<FPlaceInfo> PlaceInfoArray) { FString JsonTxt; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&JsonTxt); Writer->WriteObjectStart(); Writer->WriteIdentifierPrefix("GameObject"); Writer->WriteArrayStart(); for (int i = 0; i < PlaceInfoArray.Num(); ++i) { //AActor* Actor = ActorArray[i]; Writer->WriteObjectStart(); FPlaceInfo Info = PlaceInfoArray[i]; //FString Name = Actor->GetFName().ToString(); Writer->WriteValue("Name", Info.Name); //FString Tag = Actor->Tags[0].ToString(); Writer->WriteValue("Id",Info.Id); Writer->WriteIdentifierPrefix("Location"); //Writer->WriteArrayStart(); Writer->WriteObjectStart(); Writer->WriteValue("X",Info.Transform.GetLocation().X); Writer->WriteValue("Y", Info.Transform.GetLocation().Y); Writer->WriteValue("Z",Info.Transform.GetLocation().Z); Writer->WriteObjectEnd(); //Writer->WriteArrayEnd(); Writer->WriteIdentifierPrefix("Rotation"); //Writer->WriteArrayStart(); Writer->WriteObjectStart(); Writer->WriteValue("X", Info.Transform.GetRotation().Euler().X); Writer->WriteValue("Y", Info.Transform.GetRotation().Euler().Y); Writer->WriteValue("Z", Info.Transform.GetRotation().Euler().Z); Writer->WriteObjectEnd(); //Writer->WriteArrayEnd(); Writer->WriteIdentifierPrefix("Scale"); //Writer->WriteArrayStart(); Writer->WriteObjectStart(); Writer->WriteValue("X", Info.Transform.GetScale3D().X); Writer->WriteValue("Y", Info.Transform.GetScale3D().Y); Writer->WriteValue("Z", Info.Transform.GetScale3D().Z); Writer->WriteObjectEnd(); //Writer->WriteArrayEnd(); Writer->WriteObjectEnd(); } Writer->WriteArrayEnd(); Writer->WriteObjectEnd(); Writer->Close(); IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get(); const void* ParentWindowWindowHandle = FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr); //const FText Title = FText::Format(LOCTEXT("CurveTable_ExportJSONDialogTitle", "Export '{0}' as JSON..."), FText::FromString("New")); const FText Title = LOCTEXT("CurveTable_ExportJSONDialogTitle", "Export Json..."); const FString CurrentFilename = "NewMap";//CurTable->AssetImportData->GetFirstFilename(); const FString FileTypes = TEXT("Curve Table JSON (*.json)|*.json"); TArray<FString> OutFilenames; DesktopPlatform->SaveFileDialog( ParentWindowWindowHandle, Title.ToString(), (CurrentFilename.IsEmpty()) ? TEXT("") : FPaths::GetPath(CurrentFilename), (CurrentFilename.IsEmpty()) ? TEXT("") : FPaths::GetBaseFilename(CurrentFilename) + TEXT(".json"), FileTypes, EFileDialogFlags::None, OutFilenames ); if (OutFilenames.Num() > 0) { FFileHelper::SaveStringToFile(JsonTxt, *OutFilenames[0]); } } TArray<FPlaceInfo> UMapBlueprintFunctionLibrary::ImportJson() { TArray<FPlaceInfo> PlaceInfoArray; FString FileTypes, AllExtensions; FileTypes = TEXT("Curve Table JSON (*.json)|*.json");//FString::Printf(TEXT("All Files (%s)|%s|%s"), *AllExtensions, *AllExtensions, *FileTypes); // Prompt the user for the filenames TArray<FString> OpenFilenames; IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get(); bool bOpened = false; int32 FilterIndex = -1; if (DesktopPlatform) { const void* ParentWindowWindowHandle = FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr); bOpened = DesktopPlatform->OpenFileDialog( ParentWindowWindowHandle, LOCTEXT("ImportDialogTitle", "Import").ToString(), "",//FEditorDirectories::Get().GetLastDirectory(ELastDirectory::GENERIC_IMPORT), TEXT(""), FileTypes, EFileDialogFlags::Multiple, OpenFilenames, FilterIndex ); } bool bLoad = false; FString JsonTxt; if (bOpened) { bLoad = FFileHelper::LoadFileToString(JsonTxt, *OpenFilenames[0]); //GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, JsonTxt); } if (bLoad) { TSharedPtr<FJsonObject> JsonObject; TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonTxt); if (FJsonSerializer::Deserialize(Reader,JsonObject)) { const TArray<TSharedPtr<FJsonValue>> Files = JsonObject->GetArrayField("GameObject"); for (int i=0;i<Files.Num();++i) { FString Name; int Id; FVector Location; FVector Rotation; FVector Scale; const TSharedPtr<FJsonObject>* FileMessageObject; if (Files[i].Get()->TryGetObject(FileMessageObject)) { Name = FileMessageObject->Get()->GetStringField("Name"); Id = FileMessageObject->Get()->GetIntegerField("Id"); /*const TSharedPtr<FJsonObject>* LocationObject; const TArray<TSharedPtr<FJsonValue>> LocationFile = FileMessageObject->Get()->GetArrayField("Location"); for (int j=0;j<LocationFile.Num();++j) { if (LocationFile[j].Get()->TryGetObject(LocationObject)) { Location.X = LocationObject->Get()->GetIntegerField("X"); Location.Y = FileMessageObject->Get()->GetObjectField("Location")->GetIntegerField("Y"); Location.Z = FileMessageObject->Get()->GetObjectField("Location")->GetIntegerField("Z"); } }*/ Location.X = FileMessageObject->Get()->GetObjectField("Location")->GetIntegerField("X"); Location.Y = FileMessageObject->Get()->GetObjectField("Location")->GetIntegerField("Y"); Location.Z = FileMessageObject->Get()->GetObjectField("Location")->GetIntegerField("Z"); Rotation.X = FileMessageObject->Get()->GetObjectField("Rotation")->GetIntegerField("X"); Rotation.Y = FileMessageObject->Get()->GetObjectField("Rotation")->GetIntegerField("Y"); Rotation.Z = FileMessageObject->Get()->GetObjectField("Rotation")->GetIntegerField("Z"); Scale.X = FileMessageObject->Get()->GetObjectField("Scale")->GetIntegerField("X"); Scale.Y = FileMessageObject->Get()->GetObjectField("Scale")->GetIntegerField("Y"); Scale.Z = FileMessageObject->Get()->GetObjectField("Scale")->GetIntegerField("Z"); FPlaceInfo Info; Info.Id = Id; Info.Transform.SetLocation(Location); Info.Transform.SetRotation(FQuat::MakeFromEuler(Rotation)); Info.Transform.SetScale3D(Scale); PlaceInfoArray.Add(Info); //FString LocStr = FString::Printf(TEXT("Location (%s)|%s|%s"),*FString::SanitizeFloat( Location.X), *FString::SanitizeFloat(Location.Y), *FString::SanitizeFloat(Location.Z)); //FString RotStr = FString::Printf(TEXT("Rotation (%s)|%s|%s"), *FString::SanitizeFloat(Rotation.X), *FString::SanitizeFloat(Rotation.Y), *FString::SanitizeFloat(Rotation.Z)); //FString ScaleStr = FString::Printf(TEXT("Scale (%s)|%s|%s"), *FString::SanitizeFloat(Scale.X), *FString::SanitizeFloat(Scale.Y), *FString::SanitizeFloat(Scale.Z)); //GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, LocStr); //GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, RotStr); //GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, ScaleStr); //GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, Name); } } } } return PlaceInfoArray; }