web-dev-qa-db-ja.com

タイプ 'System.Collections.Generic.List`1に現在のJSONオブジェクト(例:{"name": "value"})をデシリアライズできません

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配列が必要であるため(たとえば[1、 2,3])正しくシリアル化解除します。このエラーを修正するには、JSONをJSON配列([1,2,3]など)に変更するか、逆シリアル化された型を通常の.NET型(たとえば、整数のようなプリミティブ型ではなくコレクション型ではない)に変更します配列またはリスト)

他の投稿を見ました。

私のjsonは次のようになります。

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

明確にするために、@ SLaksの答えに加えて、次の行を変更する必要がありました。

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

このようなものに:

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

エラーメッセージを伝えるのは非常に難しいため、1つのオブジェクトをコレクションに逆シリアル化することはできません(List<>)。

単一のRootObjectに逆シリアル化したい。

12
SLaks

以下のようなdataキーなしでjsonを変更できますか?

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

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

それが役に立てば幸い。

2
Nelson Parra

実際の問題は、FacebookClientでdynamic return type Get methodを使用していることです。そして、シリアライズにメソッドを使用しますが、その後JSONコンバーターはこのオブジェクトをデシリアライズできません。

Instedの使用:

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

お役に立てれば。

0
Rawson