using System.Collections;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Nodes;
public static class JsonExtensions
public static JsonNode TryAddPropertyToArrayElements<TProperty>(this JsonNode node, string name, TProperty value)
if (node is JsonArray array)
foreach (var obj in array.OfType<JsonObject>())
obj[name] = JsonSerializer.SerializeToNode(value);
public static JsonElement TryAddPropertyToArrayElements<TProperty>(this JsonElement element, string name, TProperty value) =>
element.ValueKind == JsonValueKind.Array
? JsonSerializer.SerializeToElement(JsonSerializer.Deserialize<JsonNode>(element)!.TryAddPropertyToArrayElements(name, value))
public static object? TryAddPropertyToArrayElements<TProperty>(this object? obj, string name, TProperty value) =>
JsonElement e => e.TryAddPropertyToArrayElements(name, value),
JsonNode n => n.TryAddPropertyToArrayElements(name, value),
_ => throw new ArgumentException("Unexpected type ${obj}"),
public static void Test()
var inputOptions = new JsonSerializerOptions
UnknownTypeHandling = JsonUnknownTypeHandling.JsonNode,
Console.WriteLine($"Testing with {inputOptions.UnknownTypeHandling}:");
var metas = JsonSerializer.Deserialize<Dictionary<string, object?>>(json, inputOptions)!;
Console.WriteLine($"Type for metas[\"key-1\"] is {metas["key-1"]?.GetType()}");
metas["key-1"] = metas["key-1"]?
.TryAddPropertyToArrayElements("newproperty", "test value");
Console.WriteLine($"Type for modified metas[\"key-1\"] is {metas["key-1"]?.GetType()}");
var newJson = JsonSerializer.Serialize(metas, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(newJson);
Assert.That(newJson.Contains("newproperty") && newJson.Contains("test value"));
Assert.Throws<ArgumentException>(() => new List<object>().TryAddPropertyToArrayElements("newproperty", "test value"));
Assert.DoesNotThrow(() => default(object)!.TryAddPropertyToArrayElements("newproperty", "test value"));
static string GetJson() =>
"#text":"Samsung Electronics"
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("System.Text.Json version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");