在.net和mono中开始使用JSON

10

我想为我的应用程序保留一个自定义配置文件,JSON似乎是一个合适的格式。

虽然我知道有.NET的JSON库,但我找不到一个好的比较评估它们的文章。而且,我的应用程序需要在mono上运行,所以更难确定使用哪个库。

这是我找到的:

我记得阅读过有一种内置方法可以进行JSON序列化和反序列化,但我不记得是什么了。

在Linux的mono上,哪个库使用起来最容易?速度并不关键,因为数据很小。

*由于该应用程序在无头Linux盒子上运行,我需要使用命令行,并希望将输入量最小化,所以我排除了XML。另外,我找不到任何可用于INF文件的库,也不熟悉标准Linux配置文件格式,而JSON是强大的。

2个回答

4

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;}
}

在我的测试中,Mono 2.8确实实现了这个类。 - Pat
看起来 DCJS 并没有以一种非常易读的方式格式化 JSON,但它能够正常工作! - Pat
我并不是在提及命名方案,我在谈论缩进(即它在JSON输出中没有使用空格,这不太易读)。 - Pat
1
哦,是的,那是个问题。如果你想在Firefox中查看它,JSON View扩展将为你格式化它。否则,JSON.Net有一个ToString方法,可以进行缩进或非缩进。 - Rob Stevenson-Leggett
有没有办法在MonoTouch中使用DataContractJsonSerializer? 我有MonoDevelop 2.8.5,它似乎只允许我在创建MonoTouch库时使用.NET 2.0引用程序集(我想从我的MonoTouch应用程序中使用)。 是否有适用于.NET 4.0的MonoTouch“绑定”? - Omri Gazitt

2
以下是使用DataContractJsonSerializer实现的代码。它在Windows和Ubuntu 9.04上的mono 2.8中运行良好(使用源代码构建的mono 2.8)。当然,它也可以在.NET上运行!我已经实现了一些来自最佳实践:数据合同版本化的建议。该文件存储在与exe相同的文件夹中(不确定是否以最佳方式完成,但在Windows和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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接