System.Text.Json 自定义序列化/反序列化

System.Text.Json Custom Seriallization / Deserialization

我有以下 class:

public class PropoertyValue {
 string Id {get;set;}
 object Value {get;set;}
 string Type {get;set;}

}

当我 serialize/deserialize Json 我希望值 属性 反映“类型”属性 中指定的类型。我该怎么做?

此处示例: Json: {"Id":"Property1","Value":0,"Type":"System.Int32"} // Type 必须是任何 POCO 对象类型。

当反序列化时,我会调用 PropertyValue class 方法,return 值:

public getValue<T>() => (T)Value;

谁能帮我解决 serialization/deserialization 的 PropertyValue 类型?

当您的 JSON 反序列化为 class 时,对象 属性 转换为 JsonElement.with 此扩展方法,您可以将 JsonElement 转换为您想要的任何类型。

public static T ToObject<T>(this JsonElement element)
{
  if (element.ValueKind != JsonValueKind.Null)
      return JsonSerializer.Deserialize<T>(element.GetRawText());
  return default(T);
}

你可以像这样使用它:

var model = new PropoertyValue();
model.Value = 0;
var jsonString = JsonSerializer.Serialize(model);
var data = JsonSerializer.Deserialize<PropoertyValue>(jsonString);
var yourObject = ((JsonElement)data.Value).ToObject<int>();

现在yourObject变量类型是Int32。

你有另一种方法;您可以使用第二个模型进行反序列化。

public class DeserializeModel {
  string Id {get;set;}
  JsonElement Value {get;set;}
  string Type {get;set;}
}

随后:

var model = new PropoertyValue();
model.Value = 0;
var jsonString = JsonSerializer.Serialize(model);
var data = JsonSerializer.Deserialize<DeserializeModel>(jsonString);
var yourObject = data.Value.ToObject<int>();