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;
}
Json作为配置文件注意事项的更多相关文章
- 二进制配置文件为什么比json等配置文件效率高
二进制配置文件为什么比json等配置文件高效 项目中用spine做动画,spine可以导出json和二进制的动画配置文件,蛋疼的是spine官方竟然没有提供c的二进制配置解析代码,更没有提供它二进制文 ...
- [08]ASP.NET Core 中 launchsettings.json 启动配置文件
ASP.NET Core launchsettings.json 启动配置文件 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自 ...
- 关于json.stringify的注意事项
今天通过navigator.getCurrentPosition中的success回调,用json.stringify打印postion时,怎么打印都只是一个{}, 而打印postion.coords ...
- 读写JSON作配置文件
个人不太喜欢XML,于是找了JSON来做配置,JSON虽然有很多引号,但这种key-value的形式,非常符合我的思维,就像是一个萝卜一个坑.最近在读写JSON文件,需要注意两个问题. 中文乱码: 直 ...
- Java 使用json 做配置文件
概述 经常会用到通过配置文件,去配置一些参数,java里面本来是有配置文件的,但是导入很麻烦的,自从我用了json之后,从此一切配置文件都见鬼去吧. 1.下载gson解析json文件的jar包 ...
- python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化
# coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...
- mpvue打包没有app.json等配置文件的解决方法
问题 一早上折腾了1个小时,小程序始终提示查找不到'app.json'文件.mpvue重新打包,光生成内容文件无配置文件. 解决办法 出错原因:版本问题 只需要把packpage.json里的mpvu ...
- JS数组转成json字符串的注意事项
在js中常常会将一个数组转成json字符串发送给后端. 这时候在定义数组数据结构的时候需要格外注意,意味json中是有集合和对象的区别的. 集合的定义是[];对象的的定义是{}. 这时候,在创建数组时 ...
- golang json 读写配置文件
package main import ( "encoding/json" "fmt" "os" ) type configuration ...
随机推荐
- 打造 高性能,轻量级的 webform框架---js直接调后台(第二天)
问题2: 每次与后台打交道 都需要写一些自己都看不太懂的事件,而且传参数很麻烦,这就是.net 封装的事件,如何解决呢? 首先以为webfrom事件,都需要写 服务器控件来绑定后台的事件 ...
- HDU - 3853
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Sub ...
- java_==和equal方法
java测试两个变量是否相等有两种方式: 一种是利用"=="运算符 值和对象的判断 一种是利用equals()方法 只是值的判断 1.如果两个变量是基本类型变量,且都是数值类型(不 ...
- 用Django做一个省份选择器
做一个省份选择器 使用django做后端, mysql数据库, jQuery 列出结构主要的文件, 其它配置比较简单 models.py 因为所有数据的结构基本一致, 把所有省份, 市和区全部存储一张 ...
- Linux(4)系统管理
系统管理 cal :查看当前月份和日历, 加-y查看整年日历 date :显示或设置时间 设置时间格式(需要管理员权限) date [MMDDhhmm[[CC]YY][.ss]]+format CC为 ...
- NYOJ116 士兵杀敌(二)
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常 ...
- python爬虫url带中文解决方案之一
import urllib2 urllib2.quote("呵呵哒") #输出 '%BA%C7%BA%C7%DF%D5'
- 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...
- shell运算符之 关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符
shell运算符有很多,关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符 1,算术运算符 原声bash 不支持简单的算术运算,可以使用expr 工具 两点注意: 表达式和运算符之间要有 ...
- 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...