Не удается найти тип System.ComponentModel.TypeConverter в модуле System.dll, Windows Phone 8.1

1

Я создаю Windows Phone Application 8.1 в Visual Studio 13. Я добавляю следующую строку кода в приложение для преобразования объекта в строку Json.

private string JsonString(object obj)
{
    var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    string jsonString = javaScriptSerializer.Serialize(obj);
    return jsonString;
}

После добавления ссылки на строку кода, следующую ссылку dll необходимо добавить в ссылку:

System.Web
Syetem.Web.Extention
System.Web.ApplicationServices

И при создании следующего сообщения об ошибке, выведенного компилятором.

Не удается найти тип System.ComponentModel.TypeConverter в модуле System.dll

Я попытался добавить System.ComponentModel.dll в ссылку на решение, но не смог его добавить из-за сообщения об ошибке:

System.ComponentModel.dll не удалось добавить, этот компонент уже автоматически ссылается на систему сборки.

Пожалуйста, помогите мне.

редактировать

Поскольку Stephan предложил Windows Phone 8.1 не поддерживать JavaScriptSerializer, я создаю новый метод, который будет преобразовывать объект в строку json следующим образом:

public string JsonString<T>(T obj)
{
    DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));

    MemoryStream memStrm = new MemoryStream();
    jsonSer.WriteObject(memStrm, (T)obj);
    StreamReader reader = new StreamReader(memStrm);
    string text = reader.ReadToEnd();

    return text;
}

Но этот метод возвращает значение string.Empty ("") для любого объекта, пожалуйста, предложите мне изменения.

EDIT 2

Следующая строка кода работает отлично для меня:

public string JsonString<T>(T obj)
{
    DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));

    string jsonValue = string.Empty;

    using (MemoryStream memStrm = new MemoryStream())
    {
        jsonSer.WriteObject(memStrm, obj);

        byte[] jsonArray = memStrm.ToArray();

        jsonValue = System.Text.Encoding.UTF8.GetString(jsonArray, 0, jsonArray.Length);
    }

    return jsonValue;
}
  • 0
    Не могли бы вы упомянуть, как десериализовать объект из строки?
  • 0
    @ Ali250 См. Мой ответ ниже.
Теги:
dll
windows-phone-8.1

3 ответа

1
Лучший ответ

Похоже, вы перепутали JavaScript с Json. Класс System.Web.Script.Serialization.JavaScriptSerializer недоступен для Windows Phone в соответствии с документацией.

JavaScriptSerializer в MSDN

Платформы: Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista с пакетом обновления 2 (SP2), Windows Server 2008 (роль сервера не поддерживается), Windows Server 2008 R2 (роль основного сервера, поддерживаемая с пакетом обновления 1 (SP1) или более поздней версии; не поддерживается)

Чтобы сериализовать/десериализовать объекты в JSON, вам лучше использовать класс DataContractJsonSerializer. Это поддерживается также на Windows Phone. DataContractJsonSerlializer в MSDN

Платформы: Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista с пакетом обновления 2 (SP2), Windows Server 2008 (роль сервера не поддерживается), Windows Server 2008 R2 (Server Core Роль поддерживается с пакетом обновления 1 (SP1) или более поздней версии (Itanium) не поддерживается)

  • 0
    Пожалуйста, вы можете помочь мне преобразовать объект в строку JSON с помощью этого подхода? вот некоторая ссылка
  • 0
    Я могу отправить вам несколько строк кода позже сегодня. Однако, пожалуйста, посмотрите на ответ @ Stígandr. Если вы согласны с добавлением отдельного пакета в ваш проект, вы также можете использовать Json Serializer от NewtonsSoft. Он предоставляет вам ту же функциональность, что и встроенный сериализатор (возможно, больше, но я не уверен в этом).
3

Я очень хорошо знаком с NewtonSoft Json Serializer aka Json.Net и очень рекомендую его, он доступен через nuget.

Простой пример

Product product = new Product{Name="Apple", Expiry=new DateTime(2008, 12, 28), Sizes = new string[]{"Small"}};
string json = JsonConvert.SerializeObject(product);

Это действительно все, что ему нужно :) Пример взят и немного изменен со своего сайта.

У вас есть связанный случай здесь, хотя и старый.

ура

  • 0
    Это решение работает нормально, но можем ли мы достичь того же с помощью DataContractJsonSerializer ?
  • 0
    @AnkushMadankar Я даже не смотрел на это раньше, но у меня большой опыт работы с DataContractSerializer , и он, как правило, ломается, как фарфор. Json.Net действительно надежный.
0

Следующие методы работают для меня для Json to string и string to Json Serialization:

/// <summary>
/// Serialize object into Json string.
/// </summary>
/// <typeparam name="T">Type of object</typeparam>
/// <param name="obj">Object which need to convert.</param>
/// <returns>Json string</returns>
public string SerializeAsJsonString<T>(T obj)
{
    var jsonSerializer = new DataContractJsonSerializer(typeof(T));
    string jsonString = string.Empty;

    using (var memStream = new System.IO.MemoryStream())
    {
        jsonSerializer.WriteObject(memStream, obj);

        byte[] jsonArray = memStream.ToArray();

        jsonString = System.Text.Encoding.UTF8.GetString(jsonArray, 0, jsonArray.Length);
    }

    return jsonString;
}

/// <summary>
/// Serialize Json string into object
/// </summary>
/// <typeparam name="T">Type of object</typeparam>
/// <param name="jsonString">Json string which need to parse into object</param>
/// <returns>Object of type T</returns>
public T DeserializeJsonString<T>(string jsonString)
{
    byte[] data = System.Text.Encoding.UTF8.GetBytes(jsonString);

    using (var memStream = new System.IO.MemoryStream(data))
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        return (T)serializer.ReadObject(memStream);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню