【问题标题】:System.Text.Json Custom Seriallization / DeserializationSystem.Text.Json 自定义序列化/反序列化
【发布时间】:2020-10-29 15:21:33
【问题描述】:

我有以下课程:

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 类型进行序列化/反序列化?

【问题讨论】:

标签: c# json system.text.json .net-standard-2.1


【解决方案1】:

当您的 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>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2021-12-08
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多