c# - 有没有办法让 Newtonsoft Json 更短?
问题描述
我目前正在使用 C# 制作一个简单的配置/选项系统(主要是为了替换 Unity 中的 PlayerPrefs 系统)。我最初将它设计为类似于 INI 文件,但决定更进一步并使用 Json 来允许无限嵌套选项。
对象的基本设置方式是:Option<T> {T Value} and Dictionary<string, Option>
在以前的 INI 设计中,它是:
[GRAPHICS]
Resolution=(X=1920, Y=1080)
使用 Json.NET,现在是:
"Graphics": {
"Value": {
"Resolution": {
"Value": {
"X": {
"Value": 1920
},
"Y": {
"Value": 1080
}
}
}
}
}
正如你所看到的,它看起来真的很乱,想知道是否有什么办法可以让它更短。例如:删除“值”部分,如下所示:
"Graphics": {
"Resolution": {
"X": 1920,
"Y": 1080,
}
}
主要目标是制作相当可扩展的东西,同时也很容易手动编辑。仅仅只是去 Yaml 会让我更接近这个目标吗?
public class IOption // (changed to class from interface because Json.Net didn't like deserialising interface)
{
public virtual dynamic Value { get; set; }
public virtual bool SetValue(object value)
{
return false;
}
}
public class Option<T> : IOption
{
public override dynamic Value { get; set; }
public Option(T value)
{
Value = value;
}
public override bool SetValue(object value)
{
try
{
Value = (T)value;
return true;
}
catch (Exception e)
{
throw e;
}
}
}
void SaveToJson()
{
IDictionary parsableOptions = new Dictionary<string, IOption>();
Save("SomePath", parsableOptions);
}
public static void Save(string path, object obj)
{
var serializer = new Newtonsoft.Json.JsonSerializer();
using (var sw = new StreamWriter(path))
using (Newtonsoft.Json.JsonWriter writer = new Newtonsoft.Json.JsonTextWriter(sw))
{
writer.Formatting = Newtonsoft.Json.Formatting.Indented;
serializer.Serialize(writer, obj);
}
}
Update: Using dynamics in place of the IOptions class produced the result I wanted. I also moved to Yaml for it's easier to read aesthetic.
解决方案
这可以使用自定义来实现JsonConverter
,您可以在此处阅读。
在您的情况下,您需要为Option<T>
该类编写一个,以便在WriteJson
调用该方法时,它只输出值。
正如@dbc 提到的,可以在此处找到此问题的答案:Json.NET - Serialize generic type wrapper without property name。
推荐阅读
- django - 用于从数据库中检索数据并对该数据进行操作的 Django 视图
- chart.js - 使用 chart.js 和注释在一小时内突出显示背景
- php - 使用php生成自动学生注册号
- android - 您可以将代码设置为间隔运行而不使用单独的方法吗?
- jquery - 在 WordPress 中,JQuery 仅在我登录时才有效
- javascript - 我应该总是将类属性放在 js 的构造函数中吗?
- python - 如何以特定方式打印字符串列表?
- flutter - 如何处理 ListView 滚动方向
- spring-boot - Spring Boot:Oauth 2.0:在 JSON 请求正文中传递访问令牌
- android - 为什么 android studio 没有为我的颤振代码显示虚拟 android 模拟器,而它显示为 java android 代码?