Начало работы с JSON в .net и mono - PullRequest
       4

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

10 голосов
/ 13 октября 2010

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 13 октября 2010

DataContractJsonSerializer может обрабатывать JSON-сериализацию , но он не такой мощный, как некоторые библиотеки, например, у него нет метода 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;}
}
2 голосов
/ 16 октября 2010

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