【问题标题】:How to deserialize a model to its type if the Type is supplied如果提供了类型,如何将模型反序列化为其类型
【发布时间】:2020-08-12 08:07:25
【问题描述】:

我正在尝试编写一个函数,该函数接受序列化的 json 对象(与对象定义类(模型)匹配)并给定类型,将其反序列化为该模型。 有几个模型,..在下面的代码中我使用TCustomerModel(只是一个属性类)

从我的 API(s) 中,我想调用此函数,将与我的模型之一匹配的 json 对象传递给它, 并将 ModelType 传递给它(即在本例中为 TCustomerModel 到目前为止,我所看到或尝试过的都不起作用。

作为一个简单的例子。 (这行得通,..但我想要一个函数,只需将 Type 传递给它就可以做到这一点,而不必在每个类型上显式创建 myModel )。

 TCustomerModel   myModel = JsonConvert.DeserializeObject<TCustomerModel>(jsonModel);

代码:

public class DeserializeModelValidator
{
    public Object ValidateModel (Type objectType, object theModel)
    {
        objectModel = JsonConvert.DeserializeObject<theModel>, typeof(objectType));
        // etc
    }
}

调用代码:(从 API 中)

DeserializeModelValidator validator = new DeserializeModelValidator();
validator.ValidateModel(typeof(TCustomerModel), objectModel);

【问题讨论】:

  • 你想反序列化一个已经反序列化的对象? JsonConvert.DeserializeObject&lt;theModel&gt;, typeof(objectType)); 你从字符串反序列化为一个对象,而不是随机的 object
  • 我认为this answer of mine 可能会有所帮助...
  • 谢谢,但它给了我一个错误。无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[Catalyst.Mvc.Controllers.API.TCustomerModel]”,因为该类型需要 JSON 数组(例如 [1,2,3]) 以正确反序列化。
  • DeserializeObject 的非泛型重载接受 Type 作为参数,这是您要找的吗?

标签: c# json asp.net-mvc json-deserialization converters


【解决方案1】:

您可以为此创建一个通用扩展方法。

public static class DeserializeModelValidator
{
    public static T ValidateModel<T>(this string serializedJson)
    {
        var result = JsonConvert.DeserializeObject<T>(serializedJson);
        // etc
        return result;
    }
}

您可以将扩展方法称为:

var myModel = jsonModel.ValidateModel<TCustomerModel>();

【讨论】:

  • 但是我如何将我的序列化 json 字符串对象传递给它,以便它可以反序列化为“TCustomerModel”类型的对象?
  • @NealRogers 扩展方法在您调用它时已经知道序列化对象字符串。在我的示例jsonModel.ValidateModel&lt;TCustomerModel&gt;() 中,jsonModel 是您的序列化 json 字符串对象。 .ValidateModel 调用字符串的扩展方法。 &lt;TCustomerMode&gt; 是用于反序列化字符串对象的类型。您可能想了解 C# 中的泛型和扩展方法以更好地理解我的答案。
【解决方案2】:

我找到了这个,它有效。现在我所需要的只是一种使用 Type 变量来实例化该类型的类的方法。 例如 useType CLasstype = new useType();

但是,这是一个不同的问题。

public object DeserializeModelr(string value, Type useType, params JsonConverter[] converters)
{
    var result = JsonConvert.DeserializeObject( value, useType,  converters);
    dynamic DataModel = Convert.ChangeType(result, useType);

    etc
}

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多