Подтвердить что ты не робот

Как я/сериализую JSON в WinRT?

Как мне взять объект и преобразовать его в строку JSON, а затем обратно в этот объект из строки, в частности, в WinRT для моего приложения Windows 8 Metro?

4b9b3361

Ответ 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(); }
    }
}

Ответ 2

Сначала сгенерируйте классы С# с помощью http://json2csharp.com/, а затем используйте 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

Ответ 3

ОП попросил ответить на вопрос, касающийся приложений метро в Windows 8, но этот вопрос возникает при выполнении основного поиска для сериализации/десериализации jsons для WinRT, поэтому я добавляю этот ответ для тех, кто ищет более современный подход.

Современный WinRT имеет встроенные обработчики для этой задачи, поэтому нет необходимости использовать JSON.net

Используйте JsonObject из Windows.Data.Json

Для сериализации используйте Parse или TryParse.

Для Stringify но все еще в формате JSON, используйте Stringify.