个人不太喜欢XML,于是找了JSON来做配置,JSON虽然有很多引号,但这种key-value的形式,非常符合我的思维,就像是一个萝卜一个坑。最近在读写JSON文件,需要注意两个问题。
中文乱码
直接像读txt一样,读取JSON配置文件
//最初的写法 File.ReadAllText(jsonPath); //防止中文乱码 File.ReadAllText(jsonPath,Encoding.Default);
写入格式
将json转成字符串写入json文件时,发现没有任何换行、空格、Tab,特别不利于查看,尤其是当数据比较多、分级多较复杂的时候。
所以,在写入之前,应当作一下小小的处理,效果如下:
格式化JSON示例:
/// <summary> /// 格式化JSON字符串 /// </summary> /// <param name="str">输入字符串</param> /// <returns>输出字符串</returns> public static string FormatJsonStr(string str) { JsonSerializer serializer = new JsonSerializer(); TextReader tr = new StringReader(str); JsonTextReader jtr = new JsonTextReader(tr); object obj = serializer.Deserialize(jtr); if (obj != null) { StringWriter textWriter = new StringWriter(); JsonTextWriter jsonWriter = new JsonTextWriter(textWriter) { Formatting = Formatting.Indented, Indentation = 4, IndentChar = ' ' }; serializer.Serialize(jsonWriter, obj); return textWriter.ToString(); } else { return str; } }
读写JSON示例:
/// <summary> /// 读取JSON文件 /// </summary> /// <param name="jsonPath">json文件路径</param> /// <returns>json字符串</returns> public static string ReadJsonString(string jsonPath) { if (!File.Exists(jsonPath)) { LogHelper.Error("配置文件不存在:"+ jsonPath); return string.Empty; } return File.ReadAllText(jsonPath,Encoding.Default); } /// <summary> ///读取JSON文件 /// </summary> /// <param name="jsonPath">json文件路径</param> /// <returns>JObject对象</returns> public static JObject ReadJsonObj(string jsonPath) { string json = ReadJsonString(jsonPath); JObject jsonObj = null; if (!string.IsNullOrEmpty(json)) { jsonObj=(JObject)JsonConvert.DeserializeObject(json); } return jsonObj; } #region 写入JSON /// <summary> /// 写入JSON /// </summary> /// <returns></returns> public static bool Write(string jsonStr,string jsonPath) { try { System.IO.File.WriteAllText(jsonPath, jsonStr, Encoding.Default); return true; } catch (System.Exception ex) { LogHelper.Error("保存结果异常" + ex.Message + ex.StackTrace); return false; } } #endregion