using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Nodes;
public interface I3rdParyObject
public string Id { get; }
class Concrete3rdParyObject : I3rdParyObject
public string Id { get; init; }
public string SomeMoreJunk { get; set; } = "this should not appear!";
public I3rdParyObject Data;
public static class DataManager
public static I3rdParyObject GetDataById(string id) => new Concrete3rdParyObject { Id = id };
public static string GetDataId(I3rdParyObject obj) => ((Concrete3rdParyObject)obj)?.Id ?? "";
public class I3rdParyObjectConverter : JsonConverter<I3rdParyObject>
public override void Write(Utf8JsonWriter writer, I3rdParyObject value, JsonSerializerOptions options) =>
writer.WriteStringValue(DataManager.GetDataId(value));
public override I3rdParyObject Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
DataManager.GetDataById(reader.GetString()!);
public static void Test()
var myClass = new MyClass
Data = DataManager.GetDataById("abc"),
var options = new JsonSerializerOptions
Converters = { new I3rdParyObjectConverter() },
var json = JsonSerializer.Serialize(myClass, options);
var myClass2 = JsonSerializer.Deserialize<MyClass>(json, options);
Assert.AreEqual(myClass.Data.Id, myClass2?.Data.Id);
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: ");