如何在WinRT中进行JSON的序列化和反序列化?

18

如何将一个对象转换成JSON字符串并从字符串中恢复为该对象,具体来说,在我的Windows 8 Metro应用程序中使用WinRT?

3个回答

38

就像这样:

using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

public static T Deserialize<T>(string json)
{
    var _Bytes = Encoding.Unicode.GetBytes(json);
    using (MemoryStream _Stream = new MemoryStream(_Bytes))
    {
        var _Serializer = new DataContractJsonSerializer(typeof(T));
        return (T)_Serializer.ReadObject(_Stream);
    }
}

public static string Serialize(object instance)
{
    using (MemoryStream _Stream = new MemoryStream())
    {
        var _Serializer = new DataContractJsonSerializer(instance.GetType());
        _Serializer.WriteObject(_Stream, instance);
        _Stream.Position = 0;
        using (StreamReader _Reader = new StreamReader(_Stream)) 
        { return _Reader.ReadToEnd(); }
    }
}

1
DataContractJsonSerializer 要求类和成员都标记有 DataContract 和 DataMember。而 Json.net 则不需要。前者更安全,因为并非所有的类都可以仅从其属性重建。后者更快,因为您并不总是控制正在序列化的对象,并且创建可序列化的中间类需要更多时间。 - Tristan

4
首先使用http://json2csharp.com/生成C#类, 然后使用http://james.newtonking.com/pages/json-net.aspx进行解析。 我当前的用户类看起来像这样:
public class User
{
    public string id { get; set; }
    public string username { get; set; }
    public string full_name { get; set; }
    public string profile_picture { get; set; }
    public string bio { get; set; }
    public string website { get; set; }
    public Counts counts { get; set; }

    public static User SingleFromJSON(string jsonString)
    {
        return JsonConvert.DeserializeObject<SingleUser>(jsonString).data;
    }

    public static User MultipleFromJSON(string jsonString)
    {
        return JsonConvert.DeserializeObject<SingleUser>(jsonString).data;
    }

    private class SingleUser
    {
        public User data { get; set; }
    }

    private class MultipleUsers
    {
        public List<User> data { get; set; }
    }
}

public class Counts
{
    public int media { get; set; }
    public int follows { get; set; }
    public int followed_by { get; set; }
}

非常容易:D

1
那当然是另一种方式。并不是每个人都喜欢使用外部库。但是json.net很受尊重。(而且速度快) - Jerry Nixon

0

OP要求回答与Windows 8上的Metro应用有关,但是当进行基本搜索以序列化/反序列化WinRT的JSON时,这个问题就会出现,所以我为那些寻找更现代方法的人添加了这个答案。

现代的WinRT已经内置了处理这个挑战的程序,因此不需要使用JSON.net

使用Windows.Data.Json中的JsonObject

对于序列化,请使用ParseTryParse

对于仍处于JSON格式的反序列化,请使用Stringify


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