【问题标题】:How do I de/serialize JSON in WinRT?如何在 WinRT 中反序列化 JSON?
【发布时间】:2019-01-29 05:58:57
【问题描述】:

我如何获取一个对象并将其转换为 JSON 字符串,然后从字符串返回到该对象,特别是在 WinRT 中用于我的 Windows 8 Metro 应用程序?

【问题讨论】:

    标签: c# winrt-xaml


    【解决方案1】:

    像这样:

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

    【讨论】:

    • DataContractJsonSerializer 要求类和成员用 DataContract 和 DataMember 标记。 Json.net 没有。前者更安全,因为并非所有类都可以仅从其属性完全重建。后者更快,因为您并不总是控制要序列化的对象,并且创建可序列化的中间类需要更多时间。
    【解决方案2】:

    首先用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

    【讨论】:

    • 当然,这是另一种方式。不是每个人都喜欢这样的外部图书馆。但是 json.net 很受尊重。 (而且很快)
    【解决方案3】:

    OP 要求提供与 Windows 8 上的 Metro 应用程序相关的答案,但是在对 WinRT 的序列化/反序列化 json 进行基本搜索时会出现这个问题,所以我为那些正在寻找的人添加了这个答案一种更现代的方法。

    现代 WinRT 已针对此挑战内置处理程序,因此无需使用 JSON.net

    使用来自Windows.Data.JsonJsonObject

    对于序列化使用ParseTryParse

    对于反序列化但仍为 JSON 格式,请使用 Stringify

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多