【问题标题】:Cannot find type System.ComponentModel.TypeConverter in module System.dll, Windows Phone 8.1在 Windows Phone 8.1 模块 System.dll 中找不到类型 System.ComponentModel.TypeConverter
【发布时间】:2015-04-06 13:07:28
【问题描述】:

我正在 Visual Studio 13 中创建 Windows Phone 应用程序 8.1。我确实在应用程序中添加了以下代码行以将对象转换为 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.dll 中找不到类型 System.ComponentModel.TypeConverter

我尝试在解决方案参考中添加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 ("") 值,请建议我更改。

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

【问题讨论】:

  • 能否请您提一下如何从字符串中反序列化对象?
  • @Ali250 请参考下面我的回答。

标签: c# json dll windows-phone-8.1


【解决方案1】:

我很喜欢 NewtonSoft's 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);

这就是它的全部内容 :) 该示例取自他们的网站并稍作修改。

You have a linked case here, though old.

干杯

【讨论】:

  • 这个解决方案工作正常,但我们可以用DataContractJsonSerializer实现同样的效果吗?
  • @AnkushMadankar 我以前什至没有看过它,但我对DataContractSerializer 有很多经验,而且它很容易像瓷器一样破碎。 Json.Net 真的很强大。
【解决方案2】:

您似乎将 JavaScript 与 Json 混为一谈。根据文档,类 System.Web.Script.Serialization.JavaScriptSerializer 不适用于 Windows Phone。

JavaScriptSerializer at MSDN

平台:Windows 8.1、Windows Server 2012 R2、Windows 8、Windows Server 2012、Windows 7、Windows Vista SP2、Windows Server 2008(不支持服务器核心角色)、Windows Server 2008 R2(SP1 或支持的服务器核心角色)稍后;不支持安腾)

要将对象序列化/反序列化为 JSON,您最好使用 DataContractJsonSerializer 类。 Windows Phone 也支持此功能。 DataContractJsonSerlializer at MSDN

平台:Windows Phone 8.1、Windows Phone 8、Windows 8.1、Windows Server 2012 R2、Windows 8、Windows Server 2012、Windows 7、Windows Vista SP2、Windows Server 2008(不支持服务器核心角色)、Windows Server 2008 R2 (SP1 或更高版本支持服务器核心角色;不支持 Itanium)

【讨论】:

  • 请问你能帮我通过这种方法将对象转换为json字符串吗? here is some reference
  • 今天晚些时候我可以给你发几行代码。但是,也请查看@Stígandr 的答案。如果您可以在项目中添加单独的包,那么您还可以使用 NewtonsSoft 的 Json 序列化器。它为您提供与内置序列化程序相同的功能(可能更多,但我不确定)。
【解决方案3】:

以下方法适用于Json to stringstring to Json 序列化:

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

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多