【问题标题】:Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1
【发布时间】:2014-02-16 23:18:42
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Facebook;
using Newtonsoft.Json;

namespace facebook
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new FacebookClient(acc_ess);
            dynamic result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"});
            string jsonstring = JsonConvert.SerializeObject(result);

            //jsonstring {"data":[{"target_id":9503123,"target_type":"user"}]}
            List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);
        }

        public class Datum
        {
            public Int64 target_id { get; set; }
            public string target_type { get; set; }
        }

        public class RootObject
        {          
            public List<Datum> data { get; set; }
        }
    }
}

无法反序列化当前 JSON 对象(例如 {"name":"value"}) 输入类型 'System.Collections.Generic.List`1[facebook.Program+RootObject]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 类型如数组或列表)可以是

我看了其他帖子。

我的 json 看起来像这样:

{"data":[{"target_id":9503123,"target_type":"user"}]}

【问题讨论】:

  • 一个根对象({"data": ..}),不是它们的列表。

标签: c# json facebook json.net


【解决方案1】:

为了清楚起见,除了@SLaks 的回答之外,这意味着您需要更改这一行:

List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);

到这样的事情:

RootObject datalist = JsonConvert.DeserializeObject<RootObject>(jsonstring);

【讨论】:

  • 这行不通,除非 RootObject 已经是一个 List
【解决方案2】:

由于错误消息很难告诉您,您无法将单个对象反序列化为集合 (List&lt;&gt;)。

您想反序列化为单个 RootObject

【讨论】:

  • 令人困惑的是,为什么它不只是将任何内容或单个值放入空数组中,而只是“执行”。如果我使用旧的DataContractJsonSerializer(typeof(string[])).ReadObject()... 执行此操作,它就可以工作,即使要反序列化为string[] 的字符串是'{}'
【解决方案3】:

这也发生在我身上,因为我试图获得 IEnumerable 但响应只有一个值。请尝试确保它是您的回复中的数据列表。我用来解决问题的行(用于 api url get)是这样的:

HttpResponseMessage response = await client.GetAsync("api/yourUrl");

if (response.IsSuccessStatusCode)
{
    IEnumerable<RootObject> rootObjects =
        awaitresponse.Content.ReadAsAsync<IEnumerable<RootObject>>();

    foreach (var rootObject in rootObjects)
    {
        Console.WriteLine(
            "{0}\t${1}\t{2}",
            rootObject.Data1, rootObject.Data2, rootObject.Data3);
    }

    Console.ReadLine();
}

希望对你有帮助。

【讨论】:

    【解决方案4】:

    您可以尝试在没有data 键的情况下更改您的 json,如下所示?

    [{"target_id":9503123,"target_type":"user"}]
    

    【讨论】:

    • [{"target_id":9503123,"target_type":"user"},{"target_id":9503123,"target_type":"user"}] 没有外大括号
    【解决方案5】:

    真正的问题是您在 FacebookClient Get 方法 中使用了 dynamic 返回类型。尽管您使用了一种序列化方法,但 JSON 转换器无法在此之后反序列化此 Object。

    使用 insted of:

    dynamic result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"}); 
    string jsonstring = JsonConvert.SerializeObject(result);
    

    类似的东西:

    string result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"}).ToString();
    

    然后你可以使用DeserializeObject方法:

    var datalist = JsonConvert.DeserializeObject<List<RootObject>>(result);
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多