1
1
using System . Collections ;
2
2
using System . Text ;
3
+ using System . Text . Encodings . Web ;
3
4
using System . Text . Json ;
4
5
5
6
namespace Cosmos . DataTransfer . Interfaces ;
@@ -18,11 +19,11 @@ public static string AsJsonString(this IDataItem dataItem, bool indented, bool i
18
19
return Encoding . UTF8 . GetString ( bytes ) ;
19
20
}
20
21
21
- public static void WriteDataItem ( Utf8JsonWriter writer , IDataItem item , bool includeNullFields , string ? objectName = null )
22
+ public static void WriteDataItem ( Utf8JsonWriter writer , IDataItem item , bool includeNullFields , JsonEncodedText ? objectName = null )
22
23
{
23
24
if ( objectName != null )
24
25
{
25
- writer . WriteStartObject ( objectName ) ;
26
+ writer . WriteStartObject ( objectName . Value ) ;
26
27
}
27
28
else
28
29
{
@@ -40,22 +41,23 @@ public static void WriteDataItem(Utf8JsonWriter writer, IDataItem item, bool inc
40
41
41
42
private static void WriteFieldValue ( Utf8JsonWriter writer , string fieldName , object ? fieldValue , bool includeNullFields )
42
43
{
44
+ var propertyName = GetAsUnescaped ( fieldName ) ;
43
45
if ( fieldValue == null )
44
46
{
45
47
if ( includeNullFields )
46
48
{
47
- writer . WriteNull ( fieldName ) ;
49
+ writer . WriteNull ( propertyName ) ;
48
50
}
49
51
}
50
52
else
51
53
{
52
54
if ( fieldValue is IDataItem child )
53
55
{
54
- WriteDataItem ( writer , child , includeNullFields , fieldName ) ;
56
+ WriteDataItem ( writer , child , includeNullFields , propertyName ) ;
55
57
}
56
58
else if ( fieldValue is not string && fieldValue is IEnumerable children )
57
59
{
58
- writer . WriteStartArray ( fieldName ) ;
60
+ writer . WriteStartArray ( propertyName ) ;
59
61
foreach ( object arrayItem in children )
60
62
{
61
63
if ( arrayItem is IDataItem arrayChild )
@@ -76,30 +78,35 @@ private static void WriteFieldValue(Utf8JsonWriter writer, string fieldName, obj
76
78
}
77
79
else
78
80
{
79
- writer . WriteStringValue ( arrayItem . ToString ( ) ) ;
81
+ writer . WriteStringValue ( GetAsUnescaped ( arrayItem . ToString ( ) ! ) ) ;
80
82
}
81
83
}
82
84
writer . WriteEndArray ( ) ;
83
85
}
84
86
else if ( TryGetNumber ( fieldValue , out var number ) )
85
87
{
86
- writer . WriteNumber ( fieldName , number ) ;
88
+ writer . WriteNumber ( propertyName , number ) ;
87
89
}
88
90
else if ( fieldValue is bool boolean )
89
91
{
90
- writer . WriteBoolean ( fieldName , boolean ) ;
92
+ writer . WriteBoolean ( propertyName , boolean ) ;
91
93
}
92
94
else if ( fieldValue is DateTime date )
93
95
{
94
- writer . WriteString ( fieldName , date . ToString ( "O" ) ) ;
96
+ writer . WriteString ( propertyName , date . ToString ( "O" ) ) ;
95
97
}
96
98
else
97
99
{
98
- writer . WriteString ( fieldName , fieldValue . ToString ( ) ) ;
100
+ writer . WriteString ( propertyName , GetAsUnescaped ( fieldValue . ToString ( ) ! ) ) ;
99
101
}
100
102
}
101
103
}
102
104
105
+ private static JsonEncodedText GetAsUnescaped ( string text )
106
+ {
107
+ return JsonEncodedText . Encode ( text , JavaScriptEncoder . UnsafeRelaxedJsonEscaping ) ;
108
+ }
109
+
103
110
private static bool TryGetNumber ( object x , out double number )
104
111
{
105
112
if ( x is float f )
0 commit comments