簡體   English   中英

使用DataContractJsonSerializer從JSON數據填充對象數組時出錯

[英]Error filling an object array from JSON data using DataContractJsonSerializer

我有一個問題。 我想從本地鏈接讀取JSON數據並將其放在對象類中。 我的問題是object []沒有填充數據。 這是我的代碼:

這是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; }
        }
    }
}

然后,我有了想要從本地服務器讀取JSON數據的Form.cs:

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"
        }
    ]
}

問題是您試圖反序列化到列表中,但是在JSON中,行數據不在根級別上,而是在對象內部。 要修復,您需要直接反序列化到serverdata類。 但是首先,您需要對屬性進行一些更改:

  1. [DataContract]標記您的serverdata
  2. 標記Rows內屬性serverdata[DataMember(Name = "ΠρομηθευτέςResult")]
  3. [DataContract]標記προμηθευτέςRow結構

您的課程應如下所示:

[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數組已正確填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM