2017-07-02 5 views
0

Ich habe ein Formular, das die Daten in Form von JSON als solche in einem Listview die zurückgegebenen Daten angezeigt werden, angenommen hat:Wie behandelt man Newtonsoft.Json.JsonSerializationException?

[ 
    { 
    "intel_content": "This intel is top secret.", 
    "intel_date": "2017-07-01T22:36:57.353345+00:00", 
    "intel_id": 3, 
    "intel_title": "2001 Intel", 
    "operation_id": 1, 
    "source_id": 1 
}, 
{ 
    "intel_content": "This is another intel on the first operation. ", 
    "intel_date": "2017-07-01T22:35:35.720128+00:00", 
    "intel_id": 2, 
    "intel_title": "Intel 505", 
    "operation_id": 1, 
    "source_id": 1 
} 
] 

Ich versuche, durch das Ergebnis in einer Schleife, die vom Server erhalten, aber ich scheine diese Ausnahme zu begegnen, habe ich dieses Problem nicht früher Dies ist mein Code:

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    using MetroFramework.Forms; 
    using MetroFramework; 
    using DalSoft.RestClient; 
    using DalSoft.RestClient.Handlers; 
    using System.Net; 
    using Newtonsoft.Json; 

namespace IGIS_Committee 
{ 
public partial class Dashboard : MetroForm 
{ 
    public Dashboard() 
    { 
     InitializeComponent(); 
    } 
    public static long selectedItl = -1; 

    private void Dashboard_Load(object sender, EventArgs e) 
    { 
     listIntels.Items.Clear(); 
     String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(Login.username + ":"+ Login.password)); 
     dynamic client = new RestClient("http://localhost:5000/api/v1/", new Dictionary<string, string> { { "Authorization", "Basic " + encoded } }); 
     getIntels(client); 
    } 
    public async void getIntels(dynamic client) 
    { 
     var result = await client.intels.Get(); 

     //dynamic dynamicObject = JsonConvert.DeserializeObject(result.ToString()); 

     // This is where the exception occurs 

     foreach (var it in result) 
     { 
      ListViewItem itl = new ListViewItem(it.intel_id.ToString()); 
      itl.SubItems.Add(it.intel_title); 
      itl.SubItems.Add(it.source_id.ToString()); 
      itl.SubItems.Add(it.intel_date.ToShortDateString()); 
      itl.SubItems.Add(it.operation_id.ToString()); 
      itl.SubItems.Add(it.intel_content); 
      listIntels.Items.Add(itl); 
     } 
    } 

    private void listIntels_DoubleClick(object sender, EventArgs e) 
    { 
     selectedItl = long.Parse(listIntels.SelectedItems[0].SubItems[0].Text); 
     IntelDetail fm = new IntelDetail(); 
     fm.ShowDialog(); 
    } 

    private void tlPost_Click(object sender, EventArgs e) 
    { 
     RateIntel fm = new RateIntel(); 
     fm.Show(); 
    } 

    private void tlViewIntels_Click(object sender, EventArgs e) 
    { 
     CommitteeRatings fm = new CommitteeRatings(); 
     fm.Show(); 
    } 

    private void tileLogout_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
     Login fm = new Login(); 
     fm.Show(); 
    } 
} 
} 

Dies ist die Ausnahme:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current 
JSON object (e.g. {"name":"value"}) into type 
'System.Collections.IEnumerable' because the type requires a JSON array 
(e.g. [1,2,3]) to deserialize correctly. 
+1

Bitte posten Sie die ganze Ausnahme. – stybl

+0

Idealerweise sollten Sie eine Klasse erstellen, die den empfangenen Daten entspricht, anstatt dynamic zu verwenden. Dann deserialisieren Sie Ihre JSON in eine 'Liste '. Dynamisch zu verwenden, verkompliziert die Dinge sehr, also entfernen Sie es, es sei denn, es ist völlig notwendig. – stybl

+0

Ich habe dynamisch in meinem Projekt verwendet, es wäre nett Wenn ich nicht alles ändern müsste, habe ich mindestens 10 weitere Formulare wie dieses @stybl – hylo

Antwort

0

Sorry, ich bin nicht in der Lage kommentieren - aber etwas, was mir bei der JSON-Serialisierung in den Sinn kommt, ist, dass das Objekt, das zur Deserialisierung gesendet wurde, manchmal ein einzelnes Element für 1 zurückgegebene Daten oder ein Array ist, wenn mehr als 1 Daten zurückgegeben wurden. (Siehe: Deserializing JSON containing single or array of objects)

Wenn dies der Fall ist, müssen Sie sich möglicherweise von dynamic entfernen. Prost

Verwandte Themen