2014-10-15 3 views
1

У меня есть одна проблема. Я хочу прочитать данные JSON из моей локальной ссылки и поместить ее в класс объектов. Моя проблема в том, что объект [] не заполнял данными. Вот мой код:Ошибка заполнения массива объектов из данных JSON с использованием DataContractJsonSerializer

Это файл serverdata.cs с моим объектом внутри, что я хочу, чтобы заполнить:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.Serialization; 
namespace Διαχείριση 
{ 
    class serverdata 
    { 

     public προμηθευτέςRow[] Rows; 
     [DataContract(Name = "ΠρομηθευτέςResult")] 
     public struct προμηθευτέςRow 
     { 
      [DataMember(Name = "Κωδικός")] 
      public int Κωδικός { get; set; } 
      [DataMember(Name = "Όνομα")] 
      public string Όνομα { get; set; } 
      [DataMember(Name = "Επίθετο")] 
      public string Επίθετο { get; set; } 
      [DataMember(Name = "Τηλέφωνο")] 
      public string Τηλέφωνο { get; set; } 
      [DataMember(Name = "Διεύθυνση")] 
      public string Διεύθυνση { get; set; } 
      [DataMember(Name = "Mail")] 
      public string Mail { get; set; } 
      [DataMember(Name = "Προϊόντα")] 
      public string[] Προϊόντα { get; set; } 
     } 
    } 
} 

Тогда я в Form.cs, которые я хочу прочитать данные в формате JSON от моего локальный сервер:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Runtime.Serialization.Json; 
namespace Διαχείριση 
{ 
    public partial class Administator_Form : Form 
    { 
     serverdata ServerData; 
     public Administator_Form() 
     { 
      ServerData = new serverdata(); 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      WebRequest request = WebRequest.Create(string.Format("mylocallink")); 
      WebResponse response = request.GetResponse(); 
      Stream stream = request.GetResponse().GetResponseStream(); 
      StreamReader sread = new StreamReader(stream); 
      //string sLine = sread.ReadLine(); 
      //MessageBox.Show(sLine); 
      DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<serverdata.προμηθευτέςRow>)); 
      var result = (List<serverdata.προμηθευτέςRow>)json.ReadObject(stream); 
      ServerData.Rows = result.ToArray(); 
     } 
    } 
} 

Теперь, если я позвоню к примеру MessageBox.Show(ServerData.Rows[0].Κωδικός.ToString()); я получаю исключение:

"An unhandled exception of type 'System.IndexOutOfRangeException' occurred in Project.exe 
Additional information: Index was outside the bounds of the array." 

Так что моя проблема в том, что result не заполнил ServerData.Rows.

Вот данные JSON:

{ 
    "ΠρομηθευτέςResult": [ 
     { 
      "Mail": "mail1", 
      "Όνομα": "name1", 
      "Διεύθυνση": "address1", 
      "Επ‌​ίθετο": "epitheto1", 
      "Κωδικός": 1, 
      "Προϊόντα": [ 
       "subproduct1.1", 
       "subproduct1.2" 
      ], 
      "Τηλέ‌​φωνο": "1111111111" 
     }, 
     { 
      "Mail": "mail2", 
      "Όνομα": "name2", 
      "Διεύθυνση": "address2", 
      "Επίθε‌​το": "epitheto2", 
      "Κωδικός": 2, 
      "Προϊόντα": [ 
       "subproduct2.1", 
       "subproduct2.2" 
      ], 
      "Τηλέφων‌​ο": "2222222222" 
     } 
    ] 
} 
+0

Вместо того, чтобы публиковать jpg-изображение какой-либо интерпретации JSON какого-то зрителя, можете ли вы поместить фактический JSON в свой вопрос в виде текста? Это облегчило бы нам помощь вам. –

+0

{"ΠρομηθευτέςResult": [{"Mail": "mail1", "Όνομα": "name1", "Διεύθυνση": "address1", "Επίθετο": "epitheto1", "Κωδικός": 1, "Προϊόντα": [ "subproduct1.1", "subproduct1.2"], "Τηλέφωνο": "1111111111"}, { "Почта": "mail2", "Όνομα": "имя2", "Διεύθυνση": "адрес2", "Επίθετο ":" epitheto2 "," Κωδικός ": 2," Προϊόντα ": [" subproduct2.1 "," subproduct2.2 "]," Tηλέφωνο ":" 2222222222 "}]} – Achill

+0

Спасибо за добавление JSON. Я добавил ответ, который, я надеюсь, будет вам полезен. –

ответ

0

Вопрос заключается в том, что вы пытаетесь десериализации в список, но в вашем JSON данные строки не на корневом уровне - она ​​находится внутри объекта , Чтобы исправить это, вам нужно десериализовать непосредственно в свой серверный класс. Но во-первых, вам нужно будет сделать пару изменений в атрибуты:

  1. Отметить свой serverdata класс с [DataContract]
  2. Марка в Rows свойство внутри serverdata с [DataMember(Name = "ΠρομηθευτέςResult")]
  3. Марка προμηθευτέςRow STRUCT с [DataContract]

Ваш класс должен выглядеть следующим образом:

[DataContract] 
class serverdata 
{ 
    [DataMember(Name = "ΠρομηθευτέςResult")] 
    public προμηθευτέςRow[] Rows { get; set; } 

    [DataContract] 
    public struct προμηθευτέςRow 
    { 
     [DataMember(Name = "Κωδικός")] 
     public int Κωδικός { get; set; } 
     [DataMember(Name = "Όνομα")] 
     public string Όνομα { get; set; } 
     [DataMember(Name = "Επίθετο")] 
     public string Επίθετο { get; set; } 
     [DataMember(Name = "Τηλέφωνο")] 
     public string Τηλέφωνο { get; set; } 
     [DataMember(Name = "Διεύθυνση")] 
     public string Διεύθυνση { get; set; } 
     [DataMember(Name = "Mail")] 
     public string Mail { get; set; } 
     [DataMember(Name = "Προϊόντα")] 
     public string[] Προϊόντα { get; set; } 
    } 
} 

Затем измените код десериализации в свой serverdata класс:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(serverdata)); 
ServerData = (serverdata)ser.ReadObject(stream); 

Вы можете удалить эту строку, как это уже не нужно:

ServerData.Rows = result.ToArray(); 

После этих изменений вы должны найти, что Rows массив заполнен правильно.

+0

Работает спасибо большое – Achill

+0

Без проблем; рад помочь. –

Смежные вопросы