Skip to content

Commit 884386f

Browse files
authored
Add Parse for MutableJsonDocument from Utf8JsonReader (Azure#38188)
* Add parse for MutableJsonDocument from Utf8JsonReader * pr fb
1 parent c77f070 commit 884386f

File tree

4 files changed

+54
-24
lines changed

4 files changed

+54
-24
lines changed

sdk/core/Azure.Core/src/DynamicData/DynamicData.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,8 @@ private class DynamicDataJsonConverter : JsonConverter<DynamicData>
348348
{
349349
public override DynamicData Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
350350
{
351-
JsonDocument document = JsonDocument.ParseValue(ref reader);
352-
return new DynamicData(new MutableJsonDocument(document, options).RootElement, DynamicDataOptions.FromSerializerOptions(options));
351+
MutableJsonDocument mdoc = MutableJsonDocument.Parse(ref reader);
352+
return new DynamicData(mdoc.RootElement, DynamicDataOptions.FromSerializerOptions(options));
353353
}
354354

355355
public override void Write(Utf8JsonWriter writer, DynamicData value, JsonSerializerOptions options)

sdk/core/Azure.Core/src/DynamicData/MutableJsonDocument.cs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,26 @@ private void WriteJson(Stream stream)
7676
{
7777
if (!Changes.HasChanges)
7878
{
79-
Write(stream, _original.Span);
79+
WriteOriginal(stream);
8080
return;
8181
}
8282

8383
using Utf8JsonWriter writer = new(stream);
8484
RootElement.WriteTo(writer);
8585
}
8686

87+
private void WriteOriginal(Stream stream)
88+
{
89+
if (_original.Length == 0)
90+
{
91+
using Utf8JsonWriter writer = new(stream);
92+
_originalDocument.WriteTo(writer);
93+
return;
94+
}
95+
96+
Write(stream, _original.Span);
97+
}
98+
8799
private void WritePatch(Stream stream)
88100
{
89101
if (!Changes.HasChanges)
@@ -142,6 +154,18 @@ public static MutableJsonDocument Parse(ReadOnlyMemory<byte> utf8Json, JsonSeria
142154
return new MutableJsonDocument(doc, utf8Json, serializerOptions);
143155
}
144156

157+
/// <summary>
158+
/// Parses JSON into a <see cref="MutableJsonDocument"/>.
159+
/// </summary>
160+
/// <param name="reader">Reader holding the JSON value.</param>
161+
/// <param name="serializerOptions">Serializer options used to serialize and deserialize any changes to the JSON.</param>
162+
/// <returns>A <see cref="MutableJsonDocument"/> representation of the value.</returns>
163+
public static MutableJsonDocument Parse(ref Utf8JsonReader reader, JsonSerializerOptions? serializerOptions = default)
164+
{
165+
JsonDocument doc = JsonDocument.ParseValue(ref reader);
166+
return new MutableJsonDocument(doc, default, serializerOptions);
167+
}
168+
145169
/// <summary>
146170
/// Parses a UTF-8 encoded string representing a single JSON value into a <see cref="MutableJsonDocument"/>.
147171
/// </summary>
@@ -175,34 +199,18 @@ public void Dispose()
175199
_originalDocument.Dispose();
176200
}
177201

178-
internal MutableJsonDocument(JsonDocument document, JsonSerializerOptions? serializerOptions) : this(document, GetBytesFromDocument(document), serializerOptions)
179-
{
180-
}
181-
182-
internal MutableJsonDocument(JsonDocument document, ReadOnlyMemory<byte> utf8Json, JsonSerializerOptions? serializerOptions)
202+
private MutableJsonDocument(JsonDocument document, ReadOnlyMemory<byte> utf8Json, JsonSerializerOptions? serializerOptions)
183203
{
184-
_original = utf8Json;
185204
_originalDocument = document;
205+
_original = utf8Json;
186206
_serializerOptions = serializerOptions ?? new JsonSerializerOptions();
187207
}
188208

189-
private static ReadOnlyMemory<byte> GetBytesFromDocument(JsonDocument document)
190-
{
191-
using MemoryStream stream = new();
192-
using (Utf8JsonWriter writer = new(stream))
193-
{
194-
document.WriteTo(writer);
195-
}
196-
197-
return new ReadOnlyMemory<byte>(stream.GetBuffer(), 0, (int)stream.Position);
198-
}
199-
200209
private class MutableJsonDocumentConverter : JsonConverter<MutableJsonDocument>
201210
{
202211
public override MutableJsonDocument Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
203212
{
204-
JsonDocument document = JsonDocument.ParseValue(ref reader);
205-
return new MutableJsonDocument(document, options);
213+
return Parse(ref reader);
206214
}
207215

208216
public override void Write(Utf8JsonWriter writer, MutableJsonDocument value, JsonSerializerOptions options)

sdk/core/Azure.Core/src/DynamicData/MutableJsonElement.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,8 +1208,8 @@ private class MutableJsonElementConverter : JsonConverter<MutableJsonElement>
12081208
{
12091209
public override MutableJsonElement Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
12101210
{
1211-
JsonDocument document = JsonDocument.ParseValue(ref reader);
1212-
return new MutableJsonDocument(document, options).RootElement;
1211+
MutableJsonDocument mdoc = MutableJsonDocument.Parse(ref reader);
1212+
return mdoc.RootElement;
12131213
}
12141214

12151215
public override void Write(Utf8JsonWriter writer, MutableJsonElement value, JsonSerializerOptions options)

sdk/core/Azure.Core/tests/DynamicData/MutableJsonDocumentTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,28 @@ public void CanChangeRootElement()
11061106
Assert.AreEqual(2, mdoc.RootElement.GetInt32());
11071107
}
11081108

1109+
[Test]
1110+
public void CanParseFromUtf8JsonReader()
1111+
{
1112+
ReadOnlySpan<byte> utf8Json = """
1113+
{
1114+
"foo": 1
1115+
}
1116+
"""u8;
1117+
Utf8JsonReader reader = new(utf8Json);
1118+
1119+
MutableJsonDocument mdoc = MutableJsonDocument.Parse(ref reader);
1120+
1121+
Assert.AreEqual(1, mdoc.RootElement.GetProperty("foo").GetInt32());
1122+
1123+
using MemoryStream stream = new();
1124+
mdoc.WriteTo(stream, "J");
1125+
stream.Flush();
1126+
stream.Position = 0;
1127+
1128+
Assert.AreEqual("""{"foo":1}""", BinaryData.FromStream(stream).ToString());
1129+
}
1130+
11091131
#region Helpers
11101132

11111133
internal static void ValidateWriteTo(BinaryData json, MutableJsonDocument mdoc)

0 commit comments

Comments
 (0)