2017-04-05 10 views
-1

何が起こっていて、どうすれば修正できますか?現在のJSONオブジェクトを逆シリアル化できません(例:{"name": "value"})

アピ - >https://developers.pipedrive.com/docs/api/v1/

public class user //related 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string email { get; set; } 
    public bool has_pic { get; set; } 
    public string pic_hash { get; set; } 
    public bool active_flag { get; set; } 
} 

public class related_objects 
{ 
    public List<organization> organization { get; set; } // Others things... 
    public List<person> person { get; set; } // Others things... 
    public List<user> user { get; set; } 
} 

public class registros 
{ 
    public bool success { get; set; } 
    public virtual List<Data> data { get; set; } 
    public virtual related_objects related_objects { get; set; } 
    public virtual additional_data additional_data { get; set; } 
} 

私は戻っJSONを取得すると、それは次のようになります。

"related_objects": { 
    "user": { 
     "478548": { 
      "id": 478548, 
      "name": "UserName", 
      "email": "UserNameMail", 
      "has_pic": false, 
      "pic_hash": null, 
      "active_flag": true 
     } 
     "478548": { 
      "id": 478548, 
      "name": "UserName2", 
      "email": "UserName2Mail", 
      "has_pic": false, 
      "pic_hash": null, 
      "active_flag": true 
     } 
    } 
} 

List<Deals.Data> _listRegistrosDeal = new List<Deals.Data>(); 
JsonTextReader JsonRetorno = new JsonTextReader(new StringReader(wbc.DownloadString(Deals))); 
JsonRetorno.SupportMultipleContent = true; 
ser.ObjectCreationHandling = ObjectCreationHandling.Replace; 
try 
{ 
    Deals.registros registros = ser.Deserialize<Deals.registros>(JsonRetorno); 
    foreach (Deals.Data reg in registros.data) 
    { 
     _listRegistrosDeal.Add(reg); 
    } 
} 
catch (JsonException ex) 
{ 
    Content(ex.Message); 
} 

List<Deals.Data> _listRegistrosDeal = new List<Deals.Data>(); 
List<Deals.user> _listuser = new List<Deals.user>(); 

JsonTextReader JsonRetorno = new JsonTextReader(new StringReader(wbc.DownloadString(Deals))); 
JsonRetorno.SupportMultipleContent = true; 
var d = wbc.DownloadString(Deals); 
ser.ObjectCreationHandling = ObjectCreationHandling.Replace; 
try 
{ 
    Deals.registros registros = ser.Deserialize<Deals.registros>(JsonRetorno); 
    foreach (Deals.Data reg in registros.data) 
    { 
     _listRegistrosDeal.Add(reg); // This works 
    } 
    foreach (Deals.user User in registros.related_objects.user) 
    { 
     _listuser.Add(User); 
    } 
} 
catch (JsonException ex) 
{ 
    Content(ex.Message); 
} 

は、私はすでに次のヒントを試してみたが、彼らは問題を解決しませんでした。

私はこのエラー+ EXを取得し続ける:

{「例えば(現在のJSONオブジェクトをデシリアライズすることはできません{\"name\":\"value\"})を型 'System.Collections.Generic.List 1[Intranet.Models.Vendas.Deals+user]' because the type requires a JSON array (e.g. [1,2,3] `)に変換して正しく逆シリアル化します。

JSONをJSON配列(例えば[1,2,3])に変更するか、デシリアライズされたタイプを通常の.NETタイプ(例えば、整数のようなプリミティブ型ではなく、arrayまたはList<T>)をJSONオブジェクトからデシリアライズすることができます。 JsonObjectAttributeを型に追加して、強制的にJSONオブジェクトから逆シリアル化することもできます。

パス 'related_objects.user.555393'、行1、位置196632. "}

Newtonsoft.Json.JsonException {Newtonsoft.Json.JsonSerializationException}

+4

エラーメッセージの答えが正しいです。配列ではないものをコレクションに入れようとしています(この場合は 'List ')。あなたはそれをすることはできません。 –

答えて

0

これに逆シリアル化:

​​

あなたのJSONは配列にする必要があり、ここで:。

"related_objects": { 
    "user": { 
     "478548": { 
      "id": 478548, 
      "name": "UserName", 
      "email": "UserNameMail", 
      "has_pic": false, 
      "pic_hash": null, 
      "active_flag": true 
     } 
    "478548": { 
      "id": 478548, 
      "name": "UserName2", 
      "email": "UserName2Mail", 
      "has_pic": false, 
      "pic_hash": null, 
      "active_flag": true 
     } 
    } 
} 

userはオブジェクトであり、配列ではありません。

修正するには、独自のコンバータを作成して、オブジェクトuserをコレクションに変更します。うまくデシリアライズする必要があり

public Dictionary<int,user> user { get; set; } 

:それとも、例えば、へuserを変更することができます。

関連する問題