UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
JsonSerializer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Dom/JsonValue.h"
7#include "Dom/JsonObject.h"
11
12class Error;
13
15{
19
27
28 struct FElement
29 {
31 : Identifier()
32 , Value(InValue)
33 { }
34
39
44
45 FElement( const FString& InIdentifier, const FValue& InValue )
47 , Value( InValue )
49 { }
50
51 FString Identifier;
53 bool bHasBeenProcessed = false;
54 bool bIsKeyValuePair = false;
55 };
56
57 JSON_API static bool GetValueFromState(const StackState& State, FValue& OutValue);
59 JSON_API static bool GetValueFromState(const StackState& State, FMapOfValues& OutMap);
60 JSON_API static void ResetValue(FValue& OutValue);
61 JSON_API static void ReadObjectStart(StackState& State);
62 JSON_API static void ReadObjectEnd(StackState& State, FValue& OutValue);
63 JSON_API static void ReadArrayStart(StackState& State);
64 JSON_API static void ReadArrayEnd(StackState& State, FValue& OutValue);
65
66 template<class CharType>
71
72 template<class CharType>
78
79 template<class CharType>
85
86 template<class CharType>
91
92 JSON_API static void ReadNull(FValue& OutValue);
93 JSON_API static void AddValueToObject(StackState& State, const FString& Identifier, FValue& NewValue);
94 JSON_API static void AddValueToArray(StackState& State, FValue& NewValue);
95
96 template<class CharType, class PrintPolicy>
98 {
99 if (Element->Value->Type == EJson::Boolean)
100 {
101 if (bWriteValueOnly)
102 {
103 Writer.WriteValue(Element->Value->AsBool());
104 }
105 else
106 {
107 Writer.WriteValue(Element->Identifier, Element->Value->AsBool());
108 }
109
110 return true;
111 }
112
113 return false;
114 }
115
116 template<class CharType, class PrintPolicy>
118 {
119 if (Element->Value->Type == EJson::Number)
120 {
121 if (bWriteValueOnly)
122 {
123 if (Element->Value->PreferStringRepresentation())
124 {
125 Writer.WriteRawJSONValue(Element->Value->AsString());
126 }
127 else
128 {
129 Writer.WriteValue(Element->Value->AsNumber());
130 }
131 }
132 else
133 {
134 if (Element->Value->PreferStringRepresentation())
135 {
136 Writer.WriteRawJSONValue(Element->Identifier, Element->Value->AsString());
137 }
138 else
139 {
140 Writer.WriteValue(Element->Identifier, Element->Value->AsNumber());
141 }
142 }
143
144 return true;
145 }
146
147 return false;
148 }
149
150 template<class CharType, class PrintPolicy>
152 {
153 if(Element->Value->Type == EJson::String)
154 {
155 if (bWriteValueOnly)
156 {
157 Writer.WriteValue(Element->Value->AsString());
158 }
159 else
160 {
161 Writer.WriteValue(Element->Identifier, Element->Value->AsString());
162 }
163
164 return true;
165 }
166
167 return false;
168 }
169
170 template<class CharType, class PrintPolicy>
172 {
173 if(Element->Value->Type == EJson::Null)
174 {
175 if (bWriteValueOnly)
176 {
177 Writer.WriteNull();
178 }
179 else
180 {
181 Writer.WriteNull(Element->Identifier);
182 }
183
184 return true;
185 }
186
187 return false;
188 }
189
190 template<class CharType, class PrintPolicy>
192 {
193 if(Element->Value->Type == EJson::Array)
194 {
195 if (Element->bHasBeenProcessed)
196 {
197 Writer.WriteArrayEnd();
198 }
199 else
200 {
201 Element->bHasBeenProcessed = true;
202 ElementStack.Push(Element);
203
204 if (bWriteValueOnly)
205 {
206 Writer.WriteArrayStart();
207 }
208 else
209 {
210 Writer.WriteArrayStart(Element->Identifier);
211 }
212
213 FArrayOfValues Values = Element->Value->AsArray();
214
215 for (int Index = Values.Num() - 1; Index >= 0; --Index)
216 {
218 }
219 }
220
221 return true;
222 }
223
224 return false;
225 }
226
227 template<class CharType, class PrintPolicy>
229 {
230 if(Element->Value->Type == EJson::Object)
231 {
232 if (Element->bHasBeenProcessed)
233 {
234 Writer.WriteObjectEnd();
235 }
236 else
237 {
238 Element->bHasBeenProcessed = true;
239 ElementStack.Push(Element);
240
241 if (bWriteValueOnly)
242 {
243 Writer.WriteObjectStart();
244 }
245 else
246 {
247 Writer.WriteObjectStart(Element->Identifier);
248 }
249
250 TArray<FString> Keys;
251 FArrayOfValues Values;
252 FMapOfValues ElementObject = Element->Value->AsObject();
253 ElementObject->Values.GenerateKeyArray(Keys);
254 ElementObject->Values.GenerateValueArray(Values);
255
256 check(Keys.Num() == Values.Num());
257
258 for (int Index = Values.Num() - 1; Index >= 0; --Index)
259 {
260 ElementStack.Push(MakeShared<FElement>(Keys[Index], Values[Index]));
261 }
262 }
263
264 return true;
265 }
266
267 return false;
268 }
269};
270
271template<typename Policy = FJsonSerializerPolicy_JsonObject>
273{
274public:
275
276 enum class EFlags
277 {
278 None = 0,
280 };
281
282 template <class CharType>
283 static bool Deserialize(const TSharedRef<TJsonReader<CharType>>& Reader, typename Policy::FValue& OutValue, EFlags InOptions = EFlags::None)
284 {
285 return Deserialize(*Reader, OutValue, InOptions);
286 }
287
288 template <class CharType>
289 static bool Deserialize(TJsonReader<CharType>& Reader, typename Policy::FValue& OutValue, EFlags InOptions = EFlags::None)
290 {
291 typename Policy::StackState State;
292 if (!Deserialize(Reader, /*OUT*/State, InOptions))
293 {
294 return false;
295 }
296
297 return Policy::GetValueFromState(State, OutValue);
298 }
299
300 template <class CharType>
301 static bool Deserialize(const TSharedRef<TJsonReader<CharType>>& Reader, typename Policy::FArrayOfValues& OutArray, EFlags InOptions = EFlags::None)
302 {
303 return Deserialize(*Reader, OutArray, InOptions);
304 }
305
306 template <class CharType>
307 static bool Deserialize(TJsonReader<CharType>& Reader, typename Policy::FArrayOfValues& OutArray, EFlags InOptions = EFlags::None)
308 {
309 typename Policy::StackState State;
310 if (!Deserialize(Reader, /*OUT*/State, InOptions))
311 {
312 return false;
313 }
314
315 return Policy::GetValueFromState(State, OutArray);
316 }
317
318 template <class CharType>
319 static bool Deserialize(const TSharedRef<TJsonReader<CharType>>& Reader, typename Policy::FMapOfValues& OutMap, EFlags InOptions = EFlags::None)
320 {
321 return Deserialize(*Reader, OutMap, InOptions);
322 }
323
324 template <class CharType>
325 static bool Deserialize(TJsonReader<CharType>& Reader, typename Policy::FMapOfValues& OutMap, EFlags InOptions = EFlags::None)
326 {
327 typename Policy::StackState State;
328 if (!Deserialize(Reader, /*OUT*/State, InOptions))
329 {
330 return false;
331 }
332
333 return Policy::GetValueFromState(State, OutMap);
334 }
335
358 template <class CharType, class PrintPolicy>
359 static bool Serialize(const typename Policy::FValue& Value, const FString& Identifier, const TSharedRef<TJsonWriter<CharType, PrintPolicy>>& Writer, bool bCloseWriter = true)
360 {
361 return Serialize(Value, Identifier, *Writer, bCloseWriter);
362 }
363
386 template <class CharType, class PrintPolicy>
392
407 template <class CharType, class PrintPolicy>
408 static bool Serialize(const typename Policy::FArrayOfValues& Array, const TSharedRef<TJsonWriter<CharType, PrintPolicy>>& Writer, bool bCloseWriter = true)
409 {
410 return Serialize(Array, *Writer, bCloseWriter);
411 }
412
427 template <class CharType, class PrintPolicy>
433
448 template <class CharType, class PrintPolicy>
449 static bool Serialize(const typename Policy::FMapOfValues& Object, const TSharedRef<TJsonWriter<CharType, PrintPolicy>>& Writer, bool bCloseWriter = true )
450 {
451 return Serialize(Object, *Writer, bCloseWriter);
452 }
453
468 template <class CharType, class PrintPolicy>
474
475private:
476 template <class CharType>
477 static bool Deserialize(TJsonReader<CharType>& Reader, typename Policy::StackState& OutStackState, EFlags InOptions)
478 {
481
482 typename Policy::FValue NewValue;
484
485 while (Reader.ReadNext(Notation))
486 {
487 FString Identifier = Reader.GetIdentifier();
488
489 Policy::ResetValue(NewValue);
490
491 bool bWasValueRead = false;
492
493 switch( Notation )
494 {
496 {
497 if (CurrentState.IsValid())
498 {
499 ScopeStack.Push(CurrentState.ToSharedRef());
500 }
501
503 CurrentState->Identifier = Identifier;
504 Policy::ReadObjectStart(*CurrentState);
505 }
506 break;
507
509 {
510 if (ScopeStack.Num() > 0)
511 {
512 Identifier = CurrentState->Identifier;
513 Policy::ReadObjectEnd(*CurrentState, NewValue);
514 bWasValueRead = true;
515 CurrentState = ScopeStack.Pop();
516 }
517 }
518 break;
519
521 {
522 if (CurrentState.IsValid())
523 {
524 ScopeStack.Push(CurrentState.ToSharedRef());
525 }
526
528 Policy::ReadArrayStart(*CurrentState);
529 CurrentState->Identifier = Identifier;
530 }
531 break;
532
534 {
535 if (ScopeStack.Num() > 0)
536 {
537 Identifier = CurrentState->Identifier;
538 Policy::ReadArrayEnd(*CurrentState, NewValue);
539 bWasValueRead = true;
540 CurrentState = ScopeStack.Pop();
541 }
542 }
543 break;
544
546 Policy::ReadBoolean(Reader, NewValue); bWasValueRead = true;
547 break;
548
550 Policy::ReadString(Reader, NewValue); bWasValueRead = true;
551 break;
552
554 {
556 {
557 Policy::ReadNumberAsString(Reader, NewValue);
558 }
559 else
560 {
561 Policy::ReadNumber(Reader, NewValue);
562 }
563
564 bWasValueRead = true;
565 }
566 break;
567
569 Policy::ReadNull(NewValue); bWasValueRead = true;
570 break;
571
573 return false;
574 break;
575 }
576
577 if (bWasValueRead && CurrentState.IsValid())
578 {
579 if (CurrentState->Type == EJson::Object)
580 {
581 Policy::AddValueToObject(*CurrentState, Identifier, NewValue);
582 }
583 else
584 {
585 Policy::AddValueToArray(*CurrentState, NewValue);
586 }
587 }
588 }
589
590 if (!CurrentState.IsValid() || !Reader.GetErrorMessage().IsEmpty())
591 {
592 return false;
593 }
594
595 OutStackState = *CurrentState.Get();
596
597 return true;
598 }
599
600 template <class CharType, class PrintPolicy>
602 {
605
606 while (ElementStack.Num() > 0)
607 {
609
610 // Empty keys are valid identifiers only when writing inside an object.
611 const bool bWriteValueOnly = !Element->bIsKeyValuePair || (Element->Identifier.IsEmpty() && Writer.GetCurrentElementType() != EJson::Object);
612
613 if (Policy::SerializeIfBool(Element, Writer, bWriteValueOnly))
614 {
615 continue;
616 }
617
618 if (Policy::SerializeIfNumber(Element, Writer, bWriteValueOnly))
619 {
620 continue;
621 }
622
623 if (Policy::SerializeIfString(Element, Writer, bWriteValueOnly))
624 {
625 continue;
626 }
627
628 if (Policy::SerializeIfNull(Element, Writer, bWriteValueOnly))
629 {
630 continue;
631 }
632
633 if (Policy::SerializeIfArray(ElementStack, Element, Writer, bWriteValueOnly))
634 {
635 continue;
636 }
637
638 if (Policy::SerializeIfObject(ElementStack, Element, Writer, bWriteValueOnly))
639 {
640 continue;
641 }
642
643 UE_LOG(LogJson, Fatal, TEXT("Could not print Json Value, unrecognized type."));
644 }
645
646 if (bCloseWriter)
647 {
648 return Writer.Close();
649 }
650 else
651 {
652 return true;
653 }
654 }
655};
656
#define check(expr)
Definition AssertionMacros.h:314
#define TEXT(x)
Definition Platform.h:1272
TSharedRef< InObjectType, InMode > MakeShared(InArgTypes &&... Args)
Definition SharedPointer.h:2009
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
return true
Definition ExternalRpcRegistry.cpp:601
EJsonNotation
Definition JsonTypes.h:60
EJson
Definition JsonTypes.h:23
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
Definition JsonValue.h:273
Definition JsonValue.h:294
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT void Push(ElementType &&Item)
Definition Array.h:1224
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
Definition JsonReader.h:41
double GetValueAsNumber() const
Definition JsonReader.h:192
virtual StoredStringType StealInternalValueAsString()
Definition JsonReader.h:186
TElementType_T< StoredStringType > StoredCharType
Definition JsonReader.h:45
bool ReadNext(EJsonNotation &Notation)
Definition JsonReader.h:57
const FString & GetErrorMessage() const
Definition JsonReader.h:210
bool GetValueAsBoolean() const
Definition JsonReader.h:204
const StoredStringType & GetValueAsNumberString() const
Definition JsonReader.h:198
virtual const FString & GetIdentifier() const
Definition JsonReader.h:164
Definition JsonSerializer.h:273
static bool Deserialize(const TSharedRef< TJsonReader< CharType > > &Reader, typename Policy::FValue &OutValue, EFlags InOptions=EFlags::None)
Definition JsonSerializer.h:283
static bool Serialize(const typename Policy::FArrayOfValues &Array, const TSharedRef< TJsonWriter< CharType, PrintPolicy > > &Writer, bool bCloseWriter=true)
Definition JsonSerializer.h:408
static bool Serialize(const typename Policy::FMapOfValues &Object, TJsonWriter< CharType, PrintPolicy > &Writer, bool bCloseWriter=true)
Definition JsonSerializer.h:469
static bool Deserialize(TJsonReader< CharType > &Reader, typename Policy::FArrayOfValues &OutArray, EFlags InOptions=EFlags::None)
Definition JsonSerializer.h:307
static bool Serialize(const typename Policy::FValue &Value, const FString &Identifier, TJsonWriter< CharType, PrintPolicy > &Writer, bool bCloseWriter=true)
Definition JsonSerializer.h:387
static bool Serialize(const typename Policy::FValue &Value, const FString &Identifier, const TSharedRef< TJsonWriter< CharType, PrintPolicy > > &Writer, bool bCloseWriter=true)
Definition JsonSerializer.h:359
static bool Serialize(const typename Policy::FMapOfValues &Object, const TSharedRef< TJsonWriter< CharType, PrintPolicy > > &Writer, bool bCloseWriter=true)
Definition JsonSerializer.h:449
static bool Deserialize(const TSharedRef< TJsonReader< CharType > > &Reader, typename Policy::FMapOfValues &OutMap, EFlags InOptions=EFlags::None)
Definition JsonSerializer.h:319
static bool Deserialize(TJsonReader< CharType > &Reader, typename Policy::FValue &OutValue, EFlags InOptions=EFlags::None)
Definition JsonSerializer.h:289
static bool Deserialize(const TSharedRef< TJsonReader< CharType > > &Reader, typename Policy::FArrayOfValues &OutArray, EFlags InOptions=EFlags::None)
Definition JsonSerializer.h:301
EFlags
Definition JsonSerializer.h:277
static bool Deserialize(TJsonReader< CharType > &Reader, typename Policy::FMapOfValues &OutMap, EFlags InOptions=EFlags::None)
Definition JsonSerializer.h:325
static bool Serialize(const typename Policy::FArrayOfValues &Array, TJsonWriter< CharType, PrintPolicy > &Writer, bool bCloseWriter=true)
Definition JsonSerializer.h:428
Definition JsonWriter.h:85
void WriteValue(uint8 Value)
Definition JsonWriter.h:201
void WriteObjectStart()
Definition JsonWriter.h:109
EJson GetCurrentElementType() const
Definition JsonWriter.h:104
void WriteObjectEnd()
Definition JsonWriter.h:140
virtual bool Close()
Definition JsonWriter.h:361
void WriteRawJSONValue(FStringView Identifier, FStringView Value)
Definition JsonWriter.h:319
void WriteNull(IdentifierType &&Identifier)
Definition JsonWriter.h:332
void WriteArrayStart()
Definition JsonWriter.h:153
void WriteArrayEnd()
Definition JsonWriter.h:183
UE_FORCEINLINE_HINT ObjectType * Get() const
Definition SharedPointer.h:1065
TSharedRef< ObjectType, Mode > ToSharedRef() const &
Definition SharedPointer.h:1028
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointer.h:1085
Definition SharedPointer.h:153
@ Element
Definition Visu.h:18
U16 Index
Definition radfft.cpp:71
Definition JsonSerializer.h:29
FElement(const FArrayOfValues &Array)
Definition JsonSerializer.h:40
FElement(const FString &InIdentifier, const FValue &InValue)
Definition JsonSerializer.h:45
FElement(const FMapOfValues &Object)
Definition JsonSerializer.h:35
FValue Value
Definition JsonSerializer.h:52
FElement(const FValue &InValue)
Definition JsonSerializer.h:30
bool bHasBeenProcessed
Definition JsonSerializer.h:53
FString Identifier
Definition JsonSerializer.h:51
bool bIsKeyValuePair
Definition JsonSerializer.h:54
Definition JsonSerializer.h:21
EJson Type
Definition JsonSerializer.h:22
TArray< TSharedPtr< FJsonValue > > Array
Definition JsonSerializer.h:24
FString Identifier
Definition JsonSerializer.h:23
TSharedPtr< FJsonObject > Object
Definition JsonSerializer.h:25
Definition JsonSerializer.h:15
static JSON_API void AddValueToObject(StackState &State, const FString &Identifier, FValue &NewValue)
Definition JsonSerializer.cpp:88
static JSON_API void ReadArrayStart(StackState &State)
Definition JsonSerializer.cpp:73
static JSON_API void ReadArrayEnd(StackState &State, FValue &OutValue)
Definition JsonSerializer.cpp:78
static JSON_API void ResetValue(FValue &OutValue)
Definition JsonSerializer.cpp:57
static bool SerializeIfObject(TArray< TSharedRef< FElement > > &ElementStack, TSharedRef< FElement > &Element, TJsonWriter< CharType, PrintPolicy > &Writer, bool bWriteValueOnly)
Definition JsonSerializer.h:228
static void ReadNumberAsString(TJsonReader< CharType > &Reader, FValue &OutValue)
Definition JsonSerializer.h:80
static JSON_API void ReadObjectEnd(StackState &State, FValue &OutValue)
Definition JsonSerializer.cpp:68
static JSON_API void ReadNull(FValue &OutValue)
Definition JsonSerializer.cpp:83
static bool SerializeIfBool(TSharedRef< FElement > &Element, TJsonWriter< CharType, PrintPolicy > &Writer, bool bWriteValueOnly)
Definition JsonSerializer.h:97
static bool SerializeIfNumber(TSharedRef< FElement > &Element, TJsonWriter< CharType, PrintPolicy > &Writer, bool bWriteValueOnly)
Definition JsonSerializer.h:117
static bool SerializeIfNull(TSharedRef< FElement > &Element, TJsonWriter< CharType, PrintPolicy > &Writer, bool bWriteValueOnly)
Definition JsonSerializer.h:171
static bool SerializeIfArray(TArray< TSharedRef< FElement > > &ElementStack, TSharedRef< FElement > &Element, TJsonWriter< CharType, PrintPolicy > &Writer, bool bWriteValueOnly)
Definition JsonSerializer.h:191
static JSON_API void AddValueToArray(StackState &State, FValue &NewValue)
Definition JsonSerializer.cpp:93
TSharedPtr< FJsonValue > FValue
Definition JsonSerializer.h:16
static JSON_API bool GetValueFromState(const StackState &State, FValue &OutValue)
Definition JsonSerializer.cpp:5
static JSON_API void ReadObjectStart(StackState &State)
Definition JsonSerializer.cpp:62
static void ReadNumber(TJsonReader< CharType > &Reader, FValue &OutValue)
Definition JsonSerializer.h:87
static void ReadBoolean(TJsonReader< CharType > &Reader, FValue &OutValue)
Definition JsonSerializer.h:67
static void ReadString(TJsonReader< CharType > &Reader, FValue &OutValue)
Definition JsonSerializer.h:73
static bool SerializeIfString(TSharedRef< FElement > &Element, TJsonWriter< CharType, PrintPolicy > &Writer, bool bWriteValueOnly)
Definition JsonSerializer.h:151