11using System . Diagnostics ;
22using System . Globalization ;
3+ using System . Numerics ;
34using System . Text . Encodings . Web ;
45using System . Text . Json ;
56using System . Text . Json . Nodes ;
@@ -19,7 +20,7 @@ namespace Altinn.App.Core.Internal.Expressions;
1920 // double is a value type where nullable takes extra space, and we only read it when it should be set
2021 private readonly double _numberValue = 0 ;
2122
22- // private readonly Dictionary<string, ExpressionValue> ? _objectValue = null;
23+ private readonly JsonObject ? _objectValue = null ;
2324 private readonly JsonArray ? _arrayValue = null ;
2425
2526 /// <summary>
@@ -84,11 +85,14 @@ private ExpressionValue(string? value)
8485 _stringValue = value ;
8586 }
8687
87- // private ExpressionValue(Dictionary<string, ExpressionValue>? value)
88- // {
89- // _valueKind = value is null ? JsonValueKind.Null : JsonValueKind.Object;
90- // _objectValue = value;
91- // }
88+ /// <summary>
89+ /// Constructor for object value
90+ /// </summary>
91+ public ExpressionValue ( JsonObject value )
92+ {
93+ ValueKind = JsonValueKind . Object ;
94+ _objectValue = value ;
95+ }
9296
9397 /// <summary>Constructor for array value</summary>
9498 public ExpressionValue ( JsonArray value )
@@ -112,10 +116,10 @@ public ExpressionValue(JsonArray value)
112116 /// </summary>
113117 public static implicit operator ExpressionValue ( string ? value ) => new ( value ) ;
114118
115- // // / <summary>
116- // // / Convert a Dictionary to ExpressionValue
117- // // / </summary>
118- // public static implicit operator ExpressionValue(Dictionary<string, ExpressionValue>? value) => new(value);
119+ /// <summary>
120+ /// Convert a Dictionary to ExpressionValue
121+ /// </summary>
122+ public static implicit operator ExpressionValue ( JsonObject value ) => new ( value ) ;
119123
120124 /// <summary>
121125 /// Convert an array to ExpressionValue
@@ -174,17 +178,20 @@ public static ExpressionValue FromObject(object? value)
174178 '"'
175179 ) // Trim quotes to match the string representation
176180 ,
177- JsonArray jsonArrayValue => jsonArrayValue ,
178- _ => ToJsonArrayOrNull ( value ) ,
181+ BigInteger => Null ,
182+ JsonObject jsonObject => jsonObject ,
183+ JsonArray jsonArray => jsonArray ,
184+ _ => ToJsonNodeOrNull ( value ) ,
179185 } ;
180186 }
181187
182- private static ExpressionValue ToJsonArrayOrNull ( object ? value )
188+ private static ExpressionValue ToJsonNodeOrNull ( object ? value )
183189 {
184190 var node = JsonSerializer . SerializeToNode ( value ) ;
185191 return node switch
186192 {
187193 JsonArray jsonArray => jsonArray ,
194+ JsonObject jsonObject => jsonObject ,
188195 _ => Null ,
189196 } ;
190197 }
@@ -202,7 +209,7 @@ private static ExpressionValue ToJsonArrayOrNull(object? value)
202209 JsonValueKind . False => false ,
203210 JsonValueKind . String => String ,
204211 JsonValueKind . Number => Number ,
205- // JsonValueKind.Object => Object,
212+ JsonValueKind . Object => Object ,
206213 JsonValueKind . Array => Array ,
207214 _ => throw new InvalidOperationException ( "Invalid value kind" ) ,
208215 } ;
@@ -249,14 +256,19 @@ private static ExpressionValue ToJsonArrayOrNull(object? value)
249256 ) ,
250257 } ;
251258
252- // public Dictionary<string, ExpressionValue> Object =>
253- // _valueKind switch
254- // {
255- // JsonValueKind.Object => _objectValue ?? throw new UnreachableException($"{this} is not an object"),
256- // _ => throw new InvalidCastException(
257- // $"The .Object property can't be used on an expression value that represent a {_valueKind}"
258- // ),
259- // };
259+ #pragma warning disable CA1720
260+ /// <summary>
261+ /// Get the value as an object (or throw if it isn't an object ValueKind)
262+ /// </summary>
263+ public JsonObject Object =>
264+ ValueKind switch
265+ {
266+ JsonValueKind . Object => _objectValue ?? throw new UnreachableException ( $ "{ this } is not an object") ,
267+ _ => throw new InvalidCastException (
268+ $ "The .Object property can't be used on an expression value that represent a { ValueKind } "
269+ ) ,
270+ } ;
271+ #pragma warning restore CA1720
260272
261273 /// <summary>Get the value as an array (or throw if it isn't an array ValueKind)</summary>
262274 public JsonArray Array =>
@@ -280,8 +292,8 @@ public override string ToString() =>
280292 JsonValueKind . False => "false" ,
281293 JsonValueKind . String => JsonSerializer . Serialize ( String , _unsafeSerializerOptionsForSerializingDates ) ,
282294 JsonValueKind . Number => Number . ToString ( CultureInfo . InvariantCulture ) ,
283- // JsonValueKind.Object => JsonSerializer.Serialize(Object),
284- // JsonValueKind.Array => JsonSerializer.Serialize(Array),
295+ JsonValueKind . Object => JsonSerializer . Serialize ( Object ) ,
296+ JsonValueKind . Array => JsonSerializer . Serialize ( Array ) ,
285297 _ => throw new InvalidOperationException ( $ "Invalid value kind { ValueKind } ") ,
286298 } ;
287299
@@ -302,7 +314,7 @@ public override string ToString() =>
302314 JsonValueKind . False => "false" ,
303315 JsonValueKind . String => String ,
304316 JsonValueKind . Number => Number . ToString ( CultureInfo . InvariantCulture ) ,
305- // JsonValueKind.Object => JsonSerializer.Serialize(Object),
317+ JsonValueKind . Object => JsonSerializer . Serialize ( Object ) ,
306318 JsonValueKind . Array => JsonSerializer . Serialize ( Array ) ,
307319 _ => throw new InvalidOperationException ( $ "Invalid value kind { ValueKind } ") ,
308320 } ;
@@ -634,7 +646,7 @@ public override ExpressionValue Read(ref Utf8JsonReader reader, Type typeToConve
634646 JsonTokenType . String => reader . GetString ( ) ,
635647 JsonTokenType . Number => reader . GetDouble ( ) ,
636648 JsonTokenType . Null => ExpressionValue . Null ,
637- // JsonTokenType.StartObject => ReadObject(ref reader),
649+ JsonTokenType . StartObject => ReadObject ( ref reader , options ) ,
638650 JsonTokenType . StartArray => ReadArray ( ref reader , options ) ,
639651 _ => throw new JsonException ( ) ,
640652 } ;
@@ -652,10 +664,17 @@ private static ExpressionValue ReadArray(ref Utf8JsonReader reader, JsonSerializ
652664 return new ExpressionValue ( values ) ;
653665 }
654666
655- // private ExpressionValue ReadObject(ref Utf8JsonReader reader)
656- // {
657- // throw new NotImplementedException();
658- // }
667+ private static ExpressionValue ReadObject ( ref Utf8JsonReader reader , JsonSerializerOptions options )
668+ {
669+ if ( reader . TokenType != JsonTokenType . StartObject )
670+ {
671+ throw new JsonException ( "Expected StartObject token." ) ;
672+ }
673+ var value =
674+ JsonSerializer . Deserialize < JsonObject > ( ref reader , options )
675+ ?? throw new JsonException ( "Expected JSON object value." ) ;
676+ return new ExpressionValue ( value ) ;
677+ }
659678
660679 /// <inheritdoc />
661680 public override void Write ( Utf8JsonWriter writer , ExpressionValue value , JsonSerializerOptions options )
@@ -678,9 +697,9 @@ public override void Write(Utf8JsonWriter writer, ExpressionValue value, JsonSer
678697 case JsonValueKind . Number :
679698 writer . WriteNumberValue ( value . Number ) ;
680699 break ;
681- // case JsonValueKind.Object:
682- // JsonSerializer.Serialize(writer, value.Object, options);
683- // break;
700+ case JsonValueKind . Object :
701+ JsonSerializer . Serialize ( writer , value . Object , options ) ;
702+ break ;
684703 case JsonValueKind . Array :
685704 JsonSerializer . Serialize ( writer , value . Array , options ) ;
686705 break ;
0 commit comments