Json作为配置文件注意事项

错误描述

在一次开发中,使用了JSON数据作为配置文件,但反序列化时总是出错,开始还以为是转义字符的问题,因为存了一个绝对路径(D:\xx\xx.json),后来测试发现竟然发现是类嵌套的问题。

解决方法

在JSON反序列化时,如果存在嵌套类,需要把嵌套的类写到包裹类里面去,并且在反序列化时传入包裹类的类型。

JSON配置文件类代码

public class SettingsHelper
    {

        private static string path = "settings.json";
        /// <summary>
        /// 读取配置
        /// </summary>
        /// <returns></returns>
        public static Settings ReadSettings()
        {
            Settings settings = new Settings();
            if (File.Exists(path))
            {
                string buffer = System.IO.File.ReadAllText(path);
                settings = (Settings)JsonHelper.Deserialize(buffer,typeof(Settings));
            }
            return settings;
        }
        /// <summary>
        /// 保存配置
        /// </summary>
        /// <param name="settings"></param>
        public static void WriteSettings(Settings settings)
        {
            string buffer = JsonHelper.Serialize(settings);
            System.IO.File.WriteAllText(path, buffer);
        }

    }
    [Serializable]
    public class Settings
    {
        /// <summary>
        /// 时间间隔
        /// </summary>
        public int TimeInterval { get; set; }
        /// <summary>
        /// 淘宝助手数据库目录
        /// </summary>
        public string ApptradePath { get; set; }
        /// <summary>
        /// 数据库服务器地址
        /// </summary>
        public string SqlServer { get; set; }
        /// <summary>
        /// 数据库账号
        /// </summary>
        public string SqlUid { get; set; }
        /// <summary>
        /// 数据库密码
        /// </summary>
        public string SqlPassword { get; set; }
        /// <summary>
        /// 数据库名称
        /// </summary>
        public string SqlDatabase { get; set; }
        /// <summary>
        /// 数据库表间映射关系集合
        /// </summary>
        public List<TableMaping> TableMapings { get; set; }

        public Settings()
        {
            ApptradePath = string.Empty;
            SqlServer = string.Empty;
            SqlUid = string.Empty;
            SqlPassword = string.Empty;
            SqlDatabase = string.Empty;
            TableMapings = new List<TableMaping>();
        }

        [Serializable]
        public class TableMaping
        {
            /// <summary>
            /// 源表名主键(用于删除数据)
            /// </summary>
            [Required(ErrorMessage="必须填写数据源表主键。")]
            public string SourceTablePrimaryKey { get; set; }
            /// <summary>
            /// 数据源源表名称
            /// </summary>
            [Required(ErrorMessage = "必须填写数据源表名称。")]
            public string SourceTableName { get; set; }
            /// <summary>
            /// 数据源表字段
            /// </summary>
            [Required(ErrorMessage = "必须填写数据源表字段。")]
            public string SourceFields { get; set; }
            /// <summary>
            /// 目标数据源表名称
            /// </summary>
            [Required(ErrorMessage = "必须填写目标数据源表名称。")]
            public string TargetTableName { get; set; }
            /// <summary>
            /// 目标表字段
            /// </summary>
            [Required(ErrorMessage = "必须填写目标表字段。")]
            public string TargetFields { get; set; }

            public TableMaping()
            {
                SourceTablePrimaryKey = string.Empty;
                SourceTableName = string.Empty;
                SourceFields = string.Empty;
                TargetFields = string.Empty;
                TargetTableName = string.Empty;
            }
        }
    }

反序列化代码

    /// <summary>
        /// 反序列化字符串,返回对象。
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static object Deserialize(string json,Type type)
        {
            object val= JsonConvert.DeserializeObject(json,type);
            return val;
        }
时间: 2024-10-13 17:09:27

Json作为配置文件注意事项的相关文章

二进制配置文件为什么比json等配置文件效率高

二进制配置文件为什么比json等配置文件高效 项目中用spine做动画,spine可以导出json和二进制的动画配置文件,蛋疼的是spine官方竟然没有提供c的二进制配置解析代码,更没有提供它二进制文件的格式说明.为了动画加载的更快,只能自己把json用python转成二进制文件(格式自定),再自行实现解析二进制的c代码了.经过小心谨慎的代码实现后,测试结果是二进制配置文件比json文件大小小了1半以上,并且动画创建速度快1倍以上.下文简单总结了一下二进制配置文件的优点. 1.什么是二进制配置文

tsconfig.json ts配置文件解析

tsconfig.json ts配置文件解析 tsconfig 编译选项 示例配置: { "compilerOptions": { //指定生成哪个模块系统代码: "None", "CommonJS", "AMD", "System", "UMD", "ES6"或 "ES2015". "module": "common

JS数组转成json字符串的注意事项

在js中常常会将一个数组转成json字符串发送给后端. 这时候在定义数组数据结构的时候需要格外注意,意味json中是有集合和对象的区别的. 集合的定义是[];对象的的定义是{}. 这时候,在创建数组时需使用不同的方式.比如创建一个集合数组: var bizhi_info_modify_arr = []; 再如创建一个对象数组: bizhi_info_modify_arr[i] = {}; bizhi_info_modify_arr[i]["id"] =$("#bizhi_li

cocos2dx-lua 笔记 &gt;使用json作为配置文件

--[[ 读取json文件到table 注意: 1,json文件用utf-8 bom格式存储, 2,json文件中不要包含注释 json文件示例 { "desc" : "关卡配置信息,(必须是utf-8 bom编码格式,且不能写注释)", "count" : 3, "firstScene" : "home" } @param filePath 文件的路径,(在res/目录,如“config/stage.js

MVC接受JSON的一些注意事项

1.MVC接受前端传的JSON数据,相应的接受参数的位置使用@RequestBody注解进行标注 2.JSON传空字符串时,后台使用Integer进行接受时,会报for String ''一堆乱七八糟的错误,需要传null,因为实体定义的类型基本全部支持null值 3.前端传的JSON里面的Key必须都已在后台接受的实体进行定义,否则会报Could not read JSON: Unrecognized field "sex"异常 原文地址:https://www.cnblogs.co

Qt读写Json格式配置文件

头文件DConfig.h 1 #pragma once 2 3 #include <QSettings> 4 #include <QFile> 5 #include <QJsonDocument> 6 #include <QJsonObject> 7 #include <QJsonArray> 8 9 class DConfig 10 { 11 public: 12 DConfig(const QString &fileName); 13

ASP.NET Core 类库中取读配置文件 appsettings.json

首先引用NuGet包 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json Microsoft.Extensions.DependencyInjection Microsoft.Extensions.Options Microsoft.Extensions.Options.ConfigurationExtensions 我们先来看一下appsettings.json文件 { "Logging"

.net core之编辑json配置文件

.net core之编辑json配置文件 引言 最近在具体项目开发应用中,项目采用的json格式配置文件,配置文件的加载采用的IConfiguration接口对象进行的管理,这是.net standard时代,微软所提供的现代化的配置管理工具. 项目设计中,需要在运行过程中,将远程服务端发送过来的配置信息回写到配置文件中.然而,必应也好,百度也罢,翻遍网络,这套现代化的配置管理模型中,却找不到一个可以改变配置回写的方法. 无奈之下,只好自己动手,手动造轮子了. .NET Standard时代的配

spring web 4.1处理json

Spring mvc处理json,我们都知道使用@ResponseBody,处理xml也是用此注解.如果想spring mvc的使用@ResponseBody注解处理json,我们需要加入一些处理bean,也可以使用默认spring提供的. 通过spring源码RequestMappingHandlerAdapter类,我们知道初始化的时候这些注解已经被加载进来,如下RequestMappingHandlerAdapter类的代码如下:argumentResolvers和returnValueH