// Modifications Copyright 2018-current Getnamo. All Rights Reserved // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. // Copyright 2014 Vladimir Alyamkin. All Rights Reserved. #pragma once #include "Runtime/Json/Public/Dom/JsonObject.h" #include "SIOJsonObject.generated.h" class USIOJsonValue; /** * Blueprintable FJsonObject wrapper */ UCLASS(BlueprintType, Blueprintable) class SIOJSON_API USIOJsonObject : public UObject { GENERATED_UCLASS_BODY() /** Create new Json object, cannot be pure */ UFUNCTION(BlueprintCallable , meta = (DisplayName = "Construct Json Object", KeyWords = "create make", HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"), Category = "SIOJ|Json") static USIOJsonObject* ConstructJsonObject(UObject* WorldContextObject); /** Reset all internal data */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void Reset(); /** Get the root Json object */ TSharedPtr& GetRootObject(); /** Set the root Json object */ void SetRootObject(const TSharedPtr& JsonObject); ////////////////////////////////////////////////////////////////////////// // Serialization /** Serialize Json to string (formatted with line breaks) */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") FString EncodeJson() const; /** Serialize Json to string (single string without line breaks) */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") FString EncodeJsonToSingleString() const; /** Construct Json object from string */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool DecodeJson(const FString& JsonString); ////////////////////////////////////////////////////////////////////////// // FJsonObject API /** Returns a list of field names that exist in the object */ UFUNCTION(BlueprintPure, Category = "SIOJ|Json") TArray GetFieldNames(); /** Checks to see if the FieldName exists in the object */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool HasField(const FString& FieldName) const; /** Remove field named FieldName */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void RemoveField(const FString& FieldName); /** Get the field named FieldName as a JsonValue */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") USIOJsonValue* GetField(const FString& FieldName) const; /** Add a field named FieldName with a Value */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetField(const FString& FieldName, USIOJsonValue* JsonValue); /** Get the field named FieldName as a Json Array */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") TArray GetArrayField(const FString& FieldName); /** Set an ObjectField named FieldName and value of Json Array */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetArrayField(const FString& FieldName, const TArray& InArray); /** Adds all of the fields from one json object to this one */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void MergeJsonObject(USIOJsonObject* InJsonObject, bool Overwrite); ////////////////////////////////////////////////////////////////////////// // FJsonObject API Helpers (easy to use with simple Json objects) /** Attempt to get the field named FieldName as a number; returns false if it doesn't exist or the type is incorrect. * Attn.!! float used instead of double to make the function blueprintable! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool TryGetNumberField(const FString& FieldName, float& OutNumber) const; /** Get the field named FieldName as a number. Ensures that the field is present and is of type Json number. * Attn.!! float used instead of double to make the function blueprintable! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") float GetNumberField(const FString& FieldName) const; /** Add a field named FieldName with Number as value * Attn.!! float used instead of double to make the function blueprintable! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetNumberField(const FString& FieldName, float Number); /** Attempt to get the field named FieldName as a string; returns false if it doesn't exist or the type is incorrect. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool TryGetStringField(const FString& FieldName, FString& OutString) const; /** Get the field named FieldName as a string. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") FString GetStringField(const FString& FieldName) const; /** Add a field named FieldName with value of StringValue */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetStringField(const FString& FieldName, const FString& StringValue); /** Attempt to get the field named FieldName as a boolean; returns false if it doesn't exist or the type is incorrect. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool TryGetBoolField(const FString& FieldName, bool& OutBool) const; /** Get the field named FieldName as a boolean. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool GetBoolField(const FString& FieldName) const; /** Set a boolean field named FieldName and value of InValue */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetBoolField(const FString& FieldName, bool InValue); /** Attempt to get the field named FieldName as an object; returns false if it doesn't exist or the type is incorrect. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") bool TryGetObjectField(const FString& FieldName, USIOJsonObject*& OutObject) const; /** Get the field named FieldName as a Json object. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") USIOJsonObject* GetObjectField(const FString& FieldName) const; /** Set an ObjectField named FieldName and value of JsonObject */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetObjectField(const FString& FieldName, USIOJsonObject* JsonObject); /** Get the field named FieldName as a binary buffer array. */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void GetBinaryField(const FString& FieldName, TArray& OutBinary) const; /** Set an BinaryField named FieldName and binary buffer array */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetBinaryField(const FString& FieldName, const TArray& Bytes); ////////////////////////////////////////////////////////////////////////// // Array fields helpers (uniform arrays) /** Get the field named FieldName as a Number Array. Use it only if you're sure that array is uniform! * Attn.!! float used instead of double to make the function blueprintable! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") TArray GetNumberArrayField(const FString& FieldName); /** Set an ObjectField named FieldName and value of Number Array * Attn.!! float used instead of double to make the function blueprintable! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetNumberArrayField(const FString& FieldName, const TArray& NumberArray); /** Get the field named FieldName as a String Array. Use it only if you're sure that array is uniform! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") TArray GetStringArrayField(const FString& FieldName); /** Set an ObjectField named FieldName and value of String Array */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetStringArrayField(const FString& FieldName, const TArray& StringArray); /** Get the field named FieldName as a Bool Array. Use it only if you're sure that array is uniform! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") TArray GetBoolArrayField(const FString& FieldName); /** Set an ObjectField named FieldName and value of Bool Array */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetBoolArrayField(const FString& FieldName, const TArray& BoolArray); /** Get the field named FieldName as an Object Array. Use it only if you're sure that array is uniform! */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") TArray GetObjectArrayField(const FString& FieldName); /** Set an ObjectField named FieldName and value of Ob Array */ UFUNCTION(BlueprintCallable, Category = "SIOJ|Json") void SetObjectArrayField(const FString& FieldName, const TArray& ObjectArray); ////////////////////////////////////////////////////////////////////////// // Data private: /** Internal JSON data */ TSharedPtr JsonObj; };