Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
JsonDictionaryConverter.cs
Go to the documentation of this file.
3
5
6internal abstract class JsonDictionaryConverter<TDictionary> : JsonResumableConverter<TDictionary>
7{
8 internal sealed override ConverterStrategy ConverterStrategy => ConverterStrategy.Dictionary;
9
11}
12internal abstract class JsonDictionaryConverter<TDictionary, TKey, TValue> : JsonDictionaryConverter<TDictionary>
13{
15
17
18 internal override Type ElementType => typeof(TValue);
19
20 internal override Type KeyType => typeof(TKey);
21
22 protected abstract void Add(TKey key, in TValue value, JsonSerializerOptions options, ref ReadStack state);
23
27
28 protected virtual void CreateCollection(ref Utf8JsonReader reader, ref ReadStack state)
29 {
30 }
31
36
38 {
39 JsonTypeInfo elementTypeInfo = state.Current.JsonTypeInfo.ElementTypeInfo;
40 if (state.UseFastPath)
41 {
42 if (reader.TokenType != JsonTokenType.StartObject)
43 {
45 }
47 if (_valueConverter == null)
48 {
50 }
51 if (_valueConverter.CanUseDirectReadOrWrite && !state.Current.NumberHandling.HasValue)
52 {
53 while (true)
54 {
55 reader.ReadWithVerify();
56 if (reader.TokenType == JsonTokenType.EndObject)
57 {
58 break;
59 }
60 TKey key = ReadDictionaryKey(ref reader, ref state);
61 reader.ReadWithVerify();
64 }
65 }
66 else
67 {
68 while (true)
69 {
70 reader.ReadWithVerify();
71 if (reader.TokenType == JsonTokenType.EndObject)
72 {
73 break;
74 }
75 TKey key2 = ReadDictionaryKey(ref reader, ref state);
76 reader.ReadWithVerify();
79 }
80 }
81 }
82 else
83 {
84 if (state.Current.ObjectState == StackFrameObjectState.None)
85 {
86 if (reader.TokenType != JsonTokenType.StartObject)
87 {
89 }
91 }
93 if (flag && (int)state.Current.ObjectState < 14)
94 {
95 if (!JsonSerializer.ResolveMetadataForJsonObject<TDictionary>(ref reader, ref state, options))
96 {
97 value = default(TDictionary);
98 return false;
99 }
100 if (state.Current.ObjectState == StackFrameObjectState.ReadRefEndObject)
101 {
102 value = (TDictionary)state.Current.ReturnValue;
103 return true;
104 }
105 }
106 if ((int)state.Current.ObjectState < 15)
107 {
108 CreateCollection(ref reader, ref state);
110 }
111 if (_valueConverter == null)
112 {
114 }
115 while (true)
116 {
117 if (state.Current.PropertyState == StackFramePropertyState.None)
118 {
120 if (!reader.Read())
121 {
122 value = default(TDictionary);
123 return false;
124 }
125 }
126 TKey val;
127 if ((int)state.Current.PropertyState < 2)
128 {
129 if (reader.TokenType == JsonTokenType.EndObject)
130 {
131 break;
132 }
134 if (flag)
135 {
136 ReadOnlySpan<byte> span = reader.GetSpan();
137 if (span.Length > 0 && span[0] == 36)
138 {
140 }
141 }
142 val = ReadDictionaryKey(ref reader, ref state);
143 }
144 else
145 {
146 val = (TKey)state.Current.DictionaryKey;
147 }
148 if ((int)state.Current.PropertyState < 3)
149 {
152 {
154 value = default(TDictionary);
155 return false;
156 }
157 }
158 if ((int)state.Current.PropertyState < 5)
159 {
160 if (!_valueConverter.TryRead(ref reader, typeof(TValue), options, ref state, out var value4))
161 {
163 value = default(TDictionary);
164 return false;
165 }
166 Add(val, in value4, options, ref state);
167 state.Current.EndElement();
168 }
169 }
170 }
172 value = (TDictionary)state.Current.ReturnValue;
173 return true;
174 TKey ReadDictionaryKey(ref Utf8JsonReader reader, ref ReadStack state)
175 {
176 if (_keyConverter == null)
177 {
178 _keyConverter = GetConverter<TKey>(state.Current.JsonTypeInfo.KeyTypeInfo);
179 }
180 string @string;
181 TKey result;
183 {
184 @string = reader.GetString();
185 result = (TKey)(object)@string;
186 }
187 else
188 {
190 @string = reader.GetString();
191 }
193 return result;
194 }
195 }
196
198 {
199 if (dictionary == null)
200 {
201 writer.WriteNullValue();
202 return true;
203 }
204 if (!state.Current.ProcessedStartToken)
205 {
207 writer.WriteStartObject();
209 {
210 return true;
211 }
212 state.Current.DeclaredJsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo.PropertyInfoForTypeInfo;
213 }
215 if (flag && !state.Current.ProcessedEndToken)
216 {
218 writer.WriteEndObject();
219 }
220 return flag;
221 }
222
227}
static MetadataPropertyName WriteReferenceForObject(JsonConverter jsonConverter, object currentValue, ref WriteStack state, Utf8JsonWriter writer)
static bool SingleValueReadWithReadAhead(ConverterStrategy converterStrategy, ref Utf8JsonReader reader, ref ReadStack state)
virtual T ReadAsPropertyNameCore(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
bool TryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, out T value)
T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
static JsonConverter< T > GetConverter< T >(JsonTypeInfo typeInfo)
virtual void ConvertCollection(ref ReadStack state, JsonSerializerOptions options)
override void CreateInstanceForReferenceResolver(ref Utf8JsonReader reader, ref ReadStack state, JsonSerializerOptions options)
override bool OnTryWrite(Utf8JsonWriter writer, TDictionary dictionary, JsonSerializerOptions options, ref WriteStack state)
virtual void CreateCollection(ref Utf8JsonReader reader, ref ReadStack state)
bool OnWriteResume(Utf8JsonWriter writer, TDictionary dictionary, JsonSerializerOptions options, ref WriteStack state)
override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, [MaybeNullWhen(false)] out TDictionary value)
void Add(TKey key, in TValue value, JsonSerializerOptions options, ref ReadStack state)
JsonTypeInfo(Type type, JsonSerializerOptions options)
static void ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
static void ThrowUnexpectedMetadataException(ReadOnlySpan< byte > propertyName, ref Utf8JsonReader reader, ref ReadStack state)