【问题标题】:create c# object from json从 json 创建 c# 对象
【发布时间】:2021-12-30 03:16:42
【问题描述】:

我有以下课程

    class Configuration
    {
        
        public IConverter converter { get; set; }

    }


    public class HtmlConverter : IConverter
    {
        public string Convert()
        {
            return "HTML Convertter";
        }
    }

    public class JsonConverter : IConverter
    {
        public string Convert()
        {
            return "json Convertter";
        }
    }

    public interface IConverter
    {
        string Convert();
    }

而myjson文件是

{
  "Configuration": {
    "Converter": "HtmlConverter"
  }
}

从 JSON 文件,我想创建配置对象。

在 json 文件中,如果转换器设置为 "HtmlConverter",则应创建 HtmlConvert 对象,如果设置了 "JsonConverter",则应创建 JsonConverter 对象。


Configuration  config = JsonConvert.DeserializeObject<Configuration>(jsonString);

【问题讨论】:

  • 您的 JSON 根对象有一个属性“Configuration”,您的根 C# 类 (Configuration) 只有一个属性“Converter”(在您的 JSON 的根对象中不存在)。跨度>
  • 你需要编写自己的 Json.NET 合约解析器来实现这个逻辑。
  • 为像你这样的简单文件创建转换器的最简单方法是创建一个新类,然后将 json 字符串复制到剪贴板,然后在可视化中转到“粘贴”->“作为 json 类”工作室。然后 VS 将创建一个模型,无需更多实现即可轻松序列化

标签: c# json


【解决方案1】:

我认为在这里你需要使用一些工厂模式。比如你的类Configuration可以是这样的

public class Configuration
{
    public string Convertor { get; set; }
    public IConverter Create()
    {
        IConverter instance = (IConverter)Activator.CreateInstance("MyAssembly", $"MyNamespace.{Convertor}").Unwrap();
        if (instance == null)
        {
            throw new Exception("Convertor not found");
        }
        return instance;
    }

}

你会以这种方式使用它。

Configuration config = JsonConvert.DeserializeObject<Configuration>(jsonString);
var converter = config.Create();

但是如果你不想使用反射,你可以使用一些 if/else 或 switch 语句。但主要思想是使用工厂模式。

你的 json 文件也应该是这样的

{
   "Convertor": "JsonConverter"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2014-07-12
    • 1970-01-01
    • 2023-03-30
    • 2019-10-21
    相关资源
    最近更新 更多