Diff
checker
テキスト
テキスト
画像
ドキュメント
Excel
フォルダ
Legal
Enterprise
デスクトップ
料金
ログイン
Diffchecker デスクトップのダウンロード
テキスト比較
2 つのテキスト ファイルの違いを見つける
ツール
履歴
表示
レイアウト
分割
統合
ライブエディター
空白の変更を非表示
未変更行を折りたたむ
折り返しなし
比較精度
スマート
構文
なし
外観を変更
処理
無視
テキスト変換
最初の差分へ移動
入力を編集
Diffchecker Desktop
Diffcheckerを実行する最も安全な方法。Diffchecker Desktopアプリを入手:あなたの差分はコンピューターから出ることはありません!
Desktopを入手
object-polymorphism-STJ
作成日
11 か月前
差分は期限切れになりません
クリア
エクスポート
共有
説明
1 削除
行
合計
削除
文字
合計
削除
この機能を引き続き使用するには、アップグレードしてください
Diff
checker
Pro
価格を見る
45 行
すべてコピー
61 追加
行
合計
追加
文字
合計
追加
この機能を引き続き使用するには、アップグレードしてください
Diff
checker
Pro
価格を見る
101 行
すべてコピー
#pragma warning disable IL2026
#pragma warning disable IL2026
#pragma warning disable IL3050
#pragma warning disable IL3050
using System.Text.Json;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Serialization.Metadata;
コピー
コピー済み
コピー
コピー済み
var jsonSettings = new JsonSerializerOptions
{
var jsonSettings = new JsonSerializerOptions
{
IncludeFields = true,
IncludeFields = true,
TypeInfoResolver = new DefaultJsonTypeInfoResolver().WithAddedModifier(AddAbcHierarchy<A>),
TypeInfoResolver = new DefaultJsonTypeInfoResolver().WithAddedModifier(AddAbcHierarchy<A>),
};
};
コピー
コピー済み
コピー
コピー済み
jsonSettings.Converters.Add(new DiscriminatedObjectConverter(
new Dictionary<string, Type> { ["A"] = typeof(A), ["B"] = typeof(B), ["C"] = typeof(C) }
));
var c = new C { Id = 1, Price = 9.99 };
var c = new C { Id = 1, Price = 9.99 };
var json1 = JsonSerializer.Serialize<A>(c, jsonSettings);
var json1 = JsonSerializer.Serialize<A>(c, jsonSettings);
Console.WriteLine(json1);
Console.WriteLine(json1);
var obj1 = JsonSerializer.Deserialize<A>(json1, jsonSettings);
var obj1 = JsonSerializer.Deserialize<A>(json1, jsonSettings);
Console.WriteLine(obj1?.GetType().Name);
Console.WriteLine(obj1?.GetType().Name);
var json2 = JsonSerializer.Serialize<object>(c, jsonSettings);
var json2 = JsonSerializer.Serialize<object>(c, jsonSettings);
Console.WriteLine(json2);
Console.WriteLine(json2);
var obj2 = JsonSerializer.Deserialize<object>(json2, jsonSettings);
var obj2 = JsonSerializer.Deserialize<object>(json2, jsonSettings);
Console.WriteLine(obj2?.GetType().Name);
Console.WriteLine(obj2?.GetType().Name);
return;
return;
static void AddAbcHierarchy<TBase>(JsonTypeInfo jsonTypeInfo)
static void AddAbcHierarchy<TBase>(JsonTypeInfo jsonTypeInfo)
{
{
if (jsonTypeInfo.Type == typeof(TBase))
if (jsonTypeInfo.Type == typeof(TBase))
{
{
コピー
コピー済み
コピー
コピー済み
var polymorphismOptions = new JsonPolymorphismOptions
{
var polymorphismOptions = new JsonPolymorphismOptions
{
TypeDiscriminatorPropertyName = "$type",
TypeDiscriminatorPropertyName = "$type",
IgnoreUnrecognizedTypeDiscriminators = false,
IgnoreUnrecognizedTypeDiscriminators = false,
UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType,
UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType,
};
};
var deriveTypes = polymorphismOptions.DerivedTypes;
var deriveTypes = polymorphismOptions.DerivedTypes;
deriveTypes.Add(new JsonDerivedType(typeof(A), "A"));
deriveTypes.Add(new JsonDerivedType(typeof(A), "A"));
deriveTypes.Add(new JsonDerivedType(typeof(B), "B"));
deriveTypes.Add(new JsonDerivedType(typeof(B), "B"));
deriveTypes.Add(new JsonDerivedType(typeof(C), "C"));
deriveTypes.Add(new JsonDerivedType(typeof(C), "C"));
jsonTypeInfo.PolymorphismOptions = polymorphismOptions;
jsonTypeInfo.PolymorphismOptions = polymorphismOptions;
}
}
}
}
class A { public int Id; }
class A { public int Id; }
コピー
コピー済み
コピー
コピー済み
class B
: A { public string? Description; }
class B
: A { public string? Description; }
class C
: A { public double Price; }
class C
: A { public double Price; }
file sealed class DiscriminatedObjectConverter : JsonConverter<object>
{
private readonly IReadOnlyDictionary<string, Type> _map;
private readonly string _disc;
public DiscriminatedObjectConverter(
IReadOnlyDictionary<string, Type> map,
string discriminatorPropertyName = "$type")
{
_map = map;
_disc = discriminatorPropertyName;
}
public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(object);
public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
using var doc = JsonDocument.ParseValue(ref reader);
var root = doc.RootElement;
if (root.ValueKind == JsonValueKind.Object &&
root.TryGetProperty(_disc, out var discProp) &&
discProp.ValueKind == JsonValueKind.String)
{
var id = discProp.GetString();
if (id != null && _map.TryGetValue(id, out var toType))
{
return root.Deserialize(toType, options)!;
}
}
// Fall back to default behavior: keep it as JsonElement
return root.Clone();
}
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
{
// If it's part of the A hierarchy, serialize *as A* to trigger polymorphism and emit $type.
if (value is A a)
{
JsonSerializer.Serialize<A>(writer, a, options);
return;
}
// Otherwise, fall back to the runtime type.
JsonSerializer.Serialize(writer, value, value?.GetType() ?? typeof(object), options);
}
}
保存された差分
原文
ファイルを開く
#pragma warning disable IL2026 #pragma warning disable IL3050 using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; var jsonSettings = new JsonSerializerOptions { IncludeFields = true, TypeInfoResolver = new DefaultJsonTypeInfoResolver().WithAddedModifier(AddAbcHierarchy<A>), }; var c = new C { Id = 1, Price = 9.99 }; var json1 = JsonSerializer.Serialize<A>(c, jsonSettings); Console.WriteLine(json1); var obj1 = JsonSerializer.Deserialize<A>(json1, jsonSettings); Console.WriteLine(obj1?.GetType().Name); var json2 = JsonSerializer.Serialize<object>(c, jsonSettings); Console.WriteLine(json2); var obj2 = JsonSerializer.Deserialize<object>(json2, jsonSettings); Console.WriteLine(obj2?.GetType().Name); return; static void AddAbcHierarchy<TBase>(JsonTypeInfo jsonTypeInfo) { if (jsonTypeInfo.Type == typeof(TBase)) { var polymorphismOptions = new JsonPolymorphismOptions { TypeDiscriminatorPropertyName = "$type", IgnoreUnrecognizedTypeDiscriminators = false, UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType, }; var deriveTypes = polymorphismOptions.DerivedTypes; deriveTypes.Add(new JsonDerivedType(typeof(A), "A")); deriveTypes.Add(new JsonDerivedType(typeof(B), "B")); deriveTypes.Add(new JsonDerivedType(typeof(C), "C")); jsonTypeInfo.PolymorphismOptions = polymorphismOptions; } } class A { public int Id; } class B: A { public string? Description; } class C: A { public double Price; }
変更されたテキスト
ファイルを開く
#pragma warning disable IL2026 #pragma warning disable IL3050 using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; var jsonSettings = new JsonSerializerOptions { IncludeFields = true, TypeInfoResolver = new DefaultJsonTypeInfoResolver().WithAddedModifier(AddAbcHierarchy<A>), }; jsonSettings.Converters.Add(new DiscriminatedObjectConverter( new Dictionary<string, Type> { ["A"] = typeof(A), ["B"] = typeof(B), ["C"] = typeof(C) } )); var c = new C { Id = 1, Price = 9.99 }; var json1 = JsonSerializer.Serialize<A>(c, jsonSettings); Console.WriteLine(json1); var obj1 = JsonSerializer.Deserialize<A>(json1, jsonSettings); Console.WriteLine(obj1?.GetType().Name); var json2 = JsonSerializer.Serialize<object>(c, jsonSettings); Console.WriteLine(json2); var obj2 = JsonSerializer.Deserialize<object>(json2, jsonSettings); Console.WriteLine(obj2?.GetType().Name); return; static void AddAbcHierarchy<TBase>(JsonTypeInfo jsonTypeInfo) { if (jsonTypeInfo.Type == typeof(TBase)) { var polymorphismOptions = new JsonPolymorphismOptions { TypeDiscriminatorPropertyName = "$type", IgnoreUnrecognizedTypeDiscriminators = false, UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType, }; var deriveTypes = polymorphismOptions.DerivedTypes; deriveTypes.Add(new JsonDerivedType(typeof(A), "A")); deriveTypes.Add(new JsonDerivedType(typeof(B), "B")); deriveTypes.Add(new JsonDerivedType(typeof(C), "C")); jsonTypeInfo.PolymorphismOptions = polymorphismOptions; } } class A { public int Id; } class B : A { public string? Description; } class C : A { public double Price; } file sealed class DiscriminatedObjectConverter : JsonConverter<object> { private readonly IReadOnlyDictionary<string, Type> _map; private readonly string _disc; public DiscriminatedObjectConverter( IReadOnlyDictionary<string, Type> map, string discriminatorPropertyName = "$type") { _map = map; _disc = discriminatorPropertyName; } public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(object); public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var doc = JsonDocument.ParseValue(ref reader); var root = doc.RootElement; if (root.ValueKind == JsonValueKind.Object && root.TryGetProperty(_disc, out var discProp) && discProp.ValueKind == JsonValueKind.String) { var id = discProp.GetString(); if (id != null && _map.TryGetValue(id, out var toType)) { return root.Deserialize(toType, options)!; } } // Fall back to default behavior: keep it as JsonElement return root.Clone(); } public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) { // If it's part of the A hierarchy, serialize *as A* to trigger polymorphism and emit $type. if (value is A a) { JsonSerializer.Serialize<A>(writer, a, options); return; } // Otherwise, fall back to the runtime type. JsonSerializer.Serialize(writer, value, value?.GetType() ?? typeof(object), options); } }
違いを見つける