【问题标题】:No parameterless constructor defined for type没有为类型定义无参数构造函数
【发布时间】:2015-01-22 17:52:33
【问题描述】:

我正在尝试学习并使用 asp.net 做一些事情。我正在尝试使用 import.io 的 api 从 json api 获取一些信息,但我想不通。我正在尝试解决它直到 2 天:

错误:没有为“imdb_io_web.IMDB[]”类型定义无参数构造函数

为什么会出现我真的不明白的错误?

我有课

namespace imdb_io_web
{
    public class IMDB
    {
        public string director { get; set; } 
    }
}

并尝试从 IMDB 获取导演姓名

var wc = new WebClient();
        var serializer = new JavaScriptSerializer();
        var result = serializer.Deserialize<IMDB[]>(wc.DownloadString("MYAPI"));
        foreach (var item in result) { Label1.Text = item.director; }

[MissingMethodException:没有为“imdb_io_web.IMDB[]”类型定义无参数构造函数。] System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 字典,Type 类型,JavaScriptSerializer 序列化器,布尔 throwOnError,Object&convertedObject) +527729 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object&convertedObject) +66 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, Object&convertedObject) +145 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化器,字符串输入,类型类型,Int32 depthLimit) +66 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(字符串输入)+70 C:\Users\ahmetozsari\documents\visual studio 2010\Projects\imdb_io_web\imdb_io_web\WebForm1.aspx.cs:26 中的 imdb_io_web.WebForm1.Page_Load(Object sender, EventArgs e) System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象发送者,EventArgs e)+51 System.Web.UI.Control.OnLoad(EventArgs e) +92 System.Web.UI.Control.LoadRecursive() +54 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

【问题讨论】:

  • Json 字符串长什么样子?
  • json 添加到主目录
  • 您是否尝试在您的 IMDB 类中添加默认构造函数?

标签: asp.net json deserialization


【解决方案1】:

要么反序列化单个元素:

 var result = serializer.Deserialize<IMDB>(wc.DownloadString("MYAPI"));
 Label1.Text = item.director;

或列表

 var result = serializer.Deserialize<List<IMDB>>(wc.DownloadString("MYAPI"));
 foreach (var item in result) { Label1.Text = item.director; }

数组类型 (IMDB[]),正如您在异常中所读到的,不能用作反序列化器的类型参数,因为它缺少无参数构造函数。使用List&lt;IMDB&gt; 应该可以解决问题。

【讨论】:

  • 谢谢,但它不允许我使用“项目”。因为它不存在。
  • 现在,当您在问题中包含实际的 JSON 时,我的回答并没有反映出这一点。稍后会更新。
【解决方案2】:

首先你可以使用 HttpClient 类进行 API 操作。

 using (var httpClient = new HttpClient())
            {
                var operationResult = await httpClient.GetStringAsync(@"http://localhost/api/requests");

            }

其次,对于JSON转换操作可以使用Json.NET

using Newtonsoft.Json;

public class RequestJson
{
    [JsonProperty("request")]
    public Request Request { get; set; }
}

public class Request
{
    [JsonProperty("name")]
    public string Name{ get; set; }

}

JsonConvert.DeserializeObject<List<RequestJson>>(operationResult );

您必须使用 List 模板类型,因为据我了解,当您创建数组类型时,Newtonsoft.Json 将无法实例化该对象,因为它需要一个大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多