从 json 创建 c# 对象

Posted

技术标签:

【中文标题】从 json 创建 c# 对象【英文标题】:create c# object from json 【发布时间】: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 将创建一个模型,无需更多实现即可轻松序列化 【参考方案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"

【讨论】:

以上是关于从 json 创建 c# 对象的主要内容,如果未能解决你的问题,请参考以下文章

C#程序将对象保存为json文件的方法

从 JSON Schema 生成 C# 类 [关闭]

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

C# 使用字符串数组中的嵌套对象动态创建 JSON

使用 C# 的复杂 JSON 对象序列化

为 json 字符串创建 c# 类,其中有数字作为对象中的变量