无法将当前 JSON 对象(例如 "name":"value")反序列化为类型 'System.Collections.Generic.List`1

Posted

技术标签:

【中文标题】无法将当前 JSON 对象(例如 "name":"value")反序列化为类型 \'System.Collections.Generic.List`1【英文标题】: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": ..),不是它们的列表。 【参考方案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\t2",
            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);

希望这会有所帮助。

【讨论】:

以上是关于无法将当前 JSON 对象(例如 "name":"value")反序列化为类型 'System.Collections.Generic.List`1的主要内容,如果未能解决你的问题,请参考以下文章

无法将当前 JSON 对象(例如 "name":"value")反序列化为类型 'System.Collections.Generic.List`1

JSON.Net - 无法将当前 json 对象(例如 "name":"value")反序列化为类型 'system.collections.generic.l

Blazor WASM“无法反序列化当前 JSON 对象(例如 "name":"value")”错误

无法将 JSON 数组(例如 [1,2,3])反序列化为类型 ' ',因为类型需要 JSON 对象(例如 "name":"value")才能正确反序列化

无法将 JSON 数组(例如 [1,2,3])反序列化为类型 ' ',因为类型需要 JSON 对象(例如 "name":"value")才能正确反序列化

无法将 JSON 数组(例如 [1,2,3])反序列化为类型 ' ',因为类型需要 JSON 对象(例如 "name":"value")来反序列化 withGe