Начало работы с JSON in.net и mono

Я хотел бы сохранить пользовательский файл конфигурации для моего приложения и JSON кажется соответствующем формате*.

Я знаю, что есть библиотеки JSON для .NET, но я не мог найти хороший сравнительный обзор их. Кроме того, мое приложение должно работать на mono, поэтому еще сложнее узнать, какую библиотеку использовать.

вот что я нашел:

Я помню читая, что есть встроенный способ (de)сериализации JSON, но я не помню, что это такое.

какую библиотеку было бы проще всего использовать в mono на linux? Скорость не критична, так как данные будут небольшими.

*поскольку приложение работает на безголовом поле linux, мне нужно использовать командную строку и хотелось бы продолжать печатать до минимума, поэтому я исключил XML. Кроме того, я не смог найти библиотеку для работы с INF-файлами, я не знаком со стандартными форматами файлов конфигурации linux, и JSON является мощным.

2 ответов


на DataContractJsonSerializer справлюсь с сериализация JSON но это не так мощно, как некоторые из библиотек, например, у него нет метода синтаксического анализа.

Это может быть способ сделать это без библиотек, поскольку я верю, что 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;}
}

ниже моя реализация с помощью DataContractJsonSerializer. Он работает в mono 2.8 на windows и ubuntu 9.04 (с mono 2.8, построенным из исходного кода). (И, конечно же, он работает в .NET!) Я реализовал некоторые предложения от Лучшие Практики: Управление Версиями Контрактов Данных . Файл хранится в той же папке, что и 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);
    }
}