我想为我的应用程序保留一个自定义配置文件,JSON似乎是一个合适的格式*。
我知道有.NET的JSON库,但我找不到它们的良好比较评论。此外,我的应用程序需要在单声道上运行,因此更难找出要使用的库。
这是我发现的:
我记得读过有一种内置的(de)序列化JSON的方法,但我不记得它是什么。
什么库最容易在linux上使用mono?速度并不重要,因为数据很小。
*由于应用程序在无头linux机器上运行,我需要使用命令行,并希望将打字输入降至最低,因此我排除了XML。此外,我找不到任何与INF文件一起使用的库,我不熟悉标准的linux配置文件格式,而且JSON功能强大。
答案 0 :(得分:4)
DataContractJsonSerializer可以处理JSON serialization,但它没有某些库那么强大,例如它没有Parse方法。
这可能是一种没有库的方法,因为我相信Mono已经实现了这个类。
使用属性获取更具可读性的JSON标记:
[DataContract]
public class SomeJsonyThing
{
[DataMember(Name="my_element")]
public string MyElement { get; set; }
[DataMember(Name="my_nested_thing")]
public object MyNestedThing { get; set;}
}
答案 1 :(得分:2)
以下是我使用DataContractJsonSerializer
的实现。它适用于Windows上的单声道2.8和ubuntu 9.04(从源代码构建单声道2.8)。 (当然,它适用于.NET!)我已经实现了Best Practices: Data Contract Versioning
的一些建议。该文件存储在与exe相同的文件夹中(不确定我是否以最佳方式执行此操作,但它适用于win和linux)。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using NLog;
[DataContract]
public class UserSettings : IExtensibleDataObject
{
ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; }
[DataMember]
public int TestIntProp { get; set; }
private string _testStringField;
}
public static class SettingsManager
{
private static Logger _logger = LogManager.GetLogger("SettingsManager");
private static UserSettings _settings;
private static readonly string _path =
Path.Combine(
Path.GetDirectoryName(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName),
"settings.json");
public static UserSettings Settings
{
get
{
return _settings;
}
}
public static void Load()
{
if (string.IsNullOrEmpty(_path))
{
_logger.Trace("empty or null path");
_settings = new UserSettings();
}
else
{
try
{
using (var stream = File.OpenRead(_path))
{
_logger.Trace("opened file");
_settings = SerializationExtensions.LoadJson<UserSettings>(stream);
_logger.Trace("deserialized file ok");
}
}
catch (Exception e)
{
_logger.TraceException("exception", e);
if (e is InvalidCastException
|| e is FileNotFoundException
|| e is SerializationException
)
{
_settings = new UserSettings();
}
else
{
throw;
}
}
}
}
public static void Save()
{
if (File.Exists(_path))
{
string destFileName = _path + ".bak";
if (File.Exists(destFileName))
{
File.Delete(destFileName);
}
File.Move(_path, destFileName);
}
using (var stream = File.Open(_path, FileMode.Create))
{
Settings.WriteJson(stream);
}
}
}
public static class SerializationExtensions
{
public static T LoadJson<T>(Stream stream) where T : class
{
var serializer = new DataContractJsonSerializer(typeof(T));
object readObject = serializer.ReadObject(stream);
return (T)readObject;
}
public static void WriteJson<T>(this T value, Stream stream) where T : class
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(stream, value);
}
}