Skip to content

Commit

Permalink
Fix JsonArray issues with empty array and GetPath() (#52339)
Browse files Browse the repository at this point in the history
  • Loading branch information
steveharter committed May 7, 2021
1 parent 8bbfd2a commit 98ac232
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 8 deletions.
Expand Up @@ -164,6 +164,7 @@ public override void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions? optio
}
else
{
CreateNodes();
Debug.Assert(_list != null);

options ??= JsonSerializerOptions.s_defaultOptions;
Expand Down Expand Up @@ -198,7 +199,9 @@ private void CreateNodes()

foreach (JsonElement element in jElement.EnumerateArray())
{
list.Add(JsonNodeConverter.Create(element, Options));
JsonNode? node = JsonNodeConverter.Create(element, Options);
node?.AssignParent(this);
list.Add(node);
}

// Clear since no longer needed.
Expand Down
Expand Up @@ -42,19 +42,20 @@ public static void WriteTo_Validation()
Assert.Throws<ArgumentNullException>(() => new JsonArray().WriteTo(null));
}

[Fact]
public static void WriteTo()
[Theory]
[InlineData("[]")]
[InlineData("[42]")]
[InlineData("[42,43]")]
public static void WriteTo(string json)
{
const string Json = "[42]";

JsonArray jArray = JsonNode.Parse(Json).AsArray();
JsonArray jArray = JsonNode.Parse(json).AsArray();
var stream = new MemoryStream();
var writer = new Utf8JsonWriter(stream);
jArray.WriteTo(writer);
writer.Flush();

string json = Encoding.UTF8.GetString(stream.ToArray());
Assert.Equal(Json, json);
string result = Encoding.UTF8.GetString(stream.ToArray());
Assert.Equal(json, result);
}

[Fact]
Expand Down
Expand Up @@ -16,34 +16,52 @@ public static void GetPathAndRoot()
Assert.Equal("$", node.GetPath());
Assert.Same(node, node.Root);

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$", node.GetPath());

node = new JsonObject();
Assert.Equal("$", node.GetPath());
Assert.Same(node, node.Root);

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$", node.GetPath());

node = new JsonArray();
Assert.Equal("$", node.GetPath());
Assert.Same(node, node.Root);

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$", node.GetPath());

node = new JsonObject
{
["Child"] = 1
};
Assert.Equal("$.Child", node["Child"].GetPath());

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$.Child", node["Child"].GetPath());

node = new JsonObject
{
["Child"] = new JsonArray { 1, 2, 3 }
};
Assert.Equal("$.Child[1]", node["Child"][1].GetPath());
Assert.Same(node, node["Child"][1].Root);

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$.Child[1]", node["Child"][1].GetPath());

node = new JsonObject
{
["Child"] = new JsonArray { 1, 2, 3 }
};
Assert.Equal("$.Child[2]", node["Child"][2].GetPath());
Assert.Same(node, node["Child"][2].Root);

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$.Child[2]", node["Child"][2].GetPath());

node = new JsonArray
{
new JsonObject
Expand All @@ -53,6 +71,9 @@ public static void GetPathAndRoot()
};
Assert.Equal("$[0].Child", node[0]["Child"].GetPath());
Assert.Same(node, node[0]["Child"].Root);

node = JsonValue.Parse(node.ToJsonString());
Assert.Equal("$[0].Child", node[0]["Child"].GetPath());
}

[Fact]
Expand Down

0 comments on commit 98ac232

Please sign in to comment.