System.Text.Json定制序列化/反序列化

问题描述

我有以下课程:

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

}

当我序列化/反序列化Json时,我希望value属性反映“ Type”属性中指定的类型。我该怎么办?

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

反序列化时,我将调用一个PropertyValue类方法来返回值:

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

有人可以帮助我进行PropertyValue类型的序列化/反序列化吗?

解决方法

当JSON反序列化为类时,对象属性将转换为JsonElement。使用此扩展方法,您可以将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>();