9#include <util/ue-header-guard-begin.h>
10#include "JsonObjectConverter.h"
11#include "Misc/FileHelper.h"
12#include "HAL/PlatformFileManager.h"
13#include "Serialization/JsonSerializer.h"
14#include "Dom/JsonObject.h"
15#include "Kismet/KismetStringLibrary.h"
16#include <util/ue-header-guard-end.h>
22 if(!FPlatformFileManager::Get().GetPlatformFile().FileExists(*FilePath))
28 if(!FFileHelper::LoadFileToString(DataRead, *FilePath))
39 if(!FFileHelper::SaveStringToFile(DataToWrite, *FilePath))
56 if(!FJsonSerializer::Deserialize(TJsonReaderFactory<>::Create(JsonString), JsonObject))
66 if(!JsonObject.IsValid())
72 if(!FJsonSerializer::Serialize(JsonObject.ToSharedRef(), TJsonWriterFactory<>::Create(&JsonString)))
89 InOutVector.X = FGenericPlatformMath::RoundToFloat(InOutVector.X);
90 InOutVector.Y = FGenericPlatformMath::RoundToFloat(InOutVector.Y);
91 InOutVector.Z = FGenericPlatformMath::RoundToFloat(InOutVector.Z);
97 FVector
Vector = FVector::ZeroVector;
98 if(!JsonObject.IsValid())
103 const FString VectorStringX = JsonObject->GetStringField(TEXT(
"X"));
104 const FString VectorStringY = JsonObject->GetStringField(TEXT(
"Y"));
105 const FString VectorStringZ = JsonObject->GetStringField(TEXT(
"Z"));
106 Vector = FVector{ FCString::Atof(*VectorStringX),FCString::Atof(*VectorStringY),FCString::Atof(*VectorStringZ) };
124 const TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
125 JsonObject->SetStringField(TEXT(
"X"), FString::SanitizeFloat(
Vector.X));
126 JsonObject->SetStringField(TEXT(
"Y"), FString::SanitizeFloat(
Vector.Y));
127 JsonObject->SetStringField(TEXT(
"Z"), FString::SanitizeFloat(
Vector.Z));
133 const FVector& Gyroscope,
float Compass,
const FString& FrameNumber)
135 TArray<TSharedPtr<FJsonValue>> ArrayValue;
136 TSharedPtr<FJsonObject> JsonDataObject =
GetSensorJsonData(JsonFilePath, ArrayValue);
139 const TSharedPtr<FJsonObject> IMUDataObject = MakeShared<FJsonObject>();
140 IMUDataObject->SetStringField(TEXT(
"Frame"), FrameNumber);
141 IMUDataObject->SetObjectField(TEXT(
"Accelerometer"),
VectorToJsonObject(Accelerometer));
145 const TSharedPtr<FJsonObject> CompassJsonObject = MakeShared<FJsonObject>();
146 FString Heading = Compass > 270.5f || Compass < 89.5f ?
"N" :
"";
147 Heading += Compass > 90.5f && Compass < 269.5f ?
"S" :
"";
148 Heading += Compass > 0.5f && Compass < 179.5f ?
"E" :
"";
149 Heading += Compass > 180.5f && Compass < 359.5f ?
"W" :
"";
150 CompassJsonObject->SetStringField(TEXT(
"Degrees"), FString::SanitizeFloat(Compass));
151 CompassJsonObject->SetStringField(TEXT(
"Sign"), Heading);
152 IMUDataObject->SetObjectField(TEXT(
"Compass"), CompassJsonObject);
154 const bool bWriteSuccess =
SaveSensorJsonData(JsonFilePath, IMUDataObject, JsonDataObject, ArrayValue);
155 return bWriteSuccess;
159 double Longitude,
const FString& FrameNumber)
161 TArray<TSharedPtr<FJsonValue>> ArrayValue;
162 TSharedPtr<FJsonObject> JsonDataObject =
GetSensorJsonData(JsonFilePath, ArrayValue);
164 const TSharedPtr<FJsonObject> IMUDataObject = MakeShared<FJsonObject>();
165 IMUDataObject->SetStringField(TEXT(
"Frame"), FrameNumber);
166 IMUDataObject->SetStringField(TEXT(
"Altitude"), FString::SanitizeFloat(Altitude));
167 IMUDataObject->SetStringField( TEXT(
"Latitude"), FString::SanitizeFloat(Latitude));
168 IMUDataObject->SetStringField(TEXT(
"Longitude"), FString::SanitizeFloat(Longitude));
170 const bool bWriteSuccess =
SaveSensorJsonData(JsonFilePath, IMUDataObject, JsonDataObject, ArrayValue);
171 return bWriteSuccess;
184 FString LineTerminator =
"\n";
187 LineTerminator = LINE_TERMINATOR;
191 DataToWrite += FString(
"ply") + LineTerminator +
192 FString(
"format ascii 1.0") + LineTerminator +
193 FString(
"element vertex ") + FString::FromInt(PointArray.Num()/ArrayElementSize) + LineTerminator +
194 FString(
"property float32 x") + LineTerminator +
195 FString(
"property float32 y") + LineTerminator +
196 FString(
"property float32 z") + LineTerminator +
197 FString(
"property float32 I") + LineTerminator +
198 FString(
"end_header") + LineTerminator;
200 for(SIZE_T i = 0; i < PointArray.Num(); i+=4)
202 if(PointArray.IsValidIndex(i+3))
205 DataToWrite += FString::SanitizeFloat(PointArray[i]) +
" " + FString::SanitizeFloat(PointArray[i+1]) +
" " + FString::SanitizeFloat(PointArray[i+2]) +
" " + FString::SanitizeFloat(PointArray[i+3]) + LineTerminator;
220 TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
221 const bool bReadSuccess =
ReadJson(JsonFilePath, JsonObject);
225 UE_LOG(LogJsonFileManagerLibrary, Log, TEXT(
"UJsonFileManagerLibrary, file not exist will create a new one: %s"), *JsonFilePath);
228 if(JsonObject->HasField(TEXT(
"DataArray")))
230 ArrayValue = JsonObject->GetArrayField(TEXT(
"DataArray"));
237 const TSharedPtr<FJsonObject> SensorDataToSave, TSharedPtr<FJsonObject> JsonDataObject,
238 TArray<TSharedPtr<FJsonValue>>& ArrayValue)
241 const TSharedRef<FJsonValue> IMUJsonValue = MakeShareable(
new FJsonValueObject(SensorDataToSave));
242 ArrayValue.Add(IMUJsonValue);
243 JsonDataObject->SetArrayField(TEXT(
"DataArray"), ArrayValue);
244 const bool bWriteSuccess =
WriteJson(JsonFilePath, JsonDataObject);
246 return bWriteSuccess;
250 const FRadarData& Rays,
const FString& FrameNumber)
252 TArray<TSharedPtr<FJsonValue>> ArrayValue;
253 TSharedPtr<FJsonObject> JsonDataObject =
GetSensorJsonData(JsonFilePath, ArrayValue);
254 bool bWriteSuccess =
true;
257 const TSharedPtr<FJsonObject> RadarDataObject = MakeShared<FJsonObject>();
258 RadarDataObject->SetStringField(TEXT(
"Frame"), FrameNumber);
259 RadarDataObject->SetStringField(TEXT(
"Velocity"), FString::SanitizeFloat(var.velocity));
260 RadarDataObject->SetStringField(TEXT(
"Azimuth"), FString::SanitizeFloat(var.azimuth));
261 RadarDataObject->SetStringField(TEXT(
"Altitude"), FString::SanitizeFloat(var.altitude));
262 RadarDataObject->SetStringField(TEXT(
"Depth"), FString::SanitizeFloat(var.depth));
263 bWriteSuccess &=
SaveSensorJsonData(JsonFilePath, RadarDataObject, JsonDataObject, ArrayValue);
266 return bWriteSuccess;
DEFINE_LOG_CATEGORY_STATIC(LogJsonFileManagerLibrary, Verbose, All)
static FVector JsonObjectToVector(const TSharedPtr< FJsonObject > &JsonObject)
static bool SaveSensorJsonData(const FString &JsonFilePath, const TSharedPtr< FJsonObject > SensorDataToSave, TSharedPtr< FJsonObject > JsonDataObject, TArray< TSharedPtr< FJsonValue > > &ArrayValue)
static bool WriteJson(const FString &JsonFilePath, const TSharedPtr< FJsonObject > JsonObject)
static bool SaveGnssDataToJson(const FString &JsonFilePath, double Altitude, double Latitude, double Longitude, const FString &FrameNumber)
static TSharedPtr< FJsonObject > GetSensorJsonData(const FString &JsonFilePath, TArray< TSharedPtr< FJsonValue > > &ArrayValue)
static bool ReadStringFromFile(const FString &FilePath, FString &DataRead)
static bool SaveLidarDataToPly(const FString &FilePath, const TArray< float > &PointArray, int ArrayElementSize)
static bool SaveRadarDataToJson(const FString &JsonFilePath, const FRadarData &Rays, const FString &FrameNumber)
static bool ReadJson(const FString &JsonFilePath, TSharedPtr< FJsonObject > &JsonObject)
static bool WriteStringFromFile(const FString &FilePath, const FString &DataToWrite)
static TSharedPtr< FJsonObject > VectorToJsonObject(const FVector &Vector)
static void RoundVectorToTwoDecimals(FVector &InOutVector)
static bool SaveIMUDataToJson(const FString &JsonFilePath, const FVector &Accelerometer, const FVector &Gyroscope, float Compass, const FString &FrameNumber)
const std::vector< RadarDetection > & GetDetections() const