首页 > 解决方案 > 有没有办法让 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.

标签: c#json.net-corejson.net

解决方案


这可以使用自定义来实现JsonConverter,您可以在此处阅读。

在您的情况下,您需要为Option<T>该类编写一个,以便在WriteJson调用该方法时,它只输出值。

正如@dbc 提到的,可以在此处找到此问题的答案:Json.NET - Serialize generic type wrapper without property name


推荐阅读