Объект теряет данные при вызове JsonConvert.DeserializeObject () - PullRequest
0 голосов
/ 09 апреля 2020

Я извлекаю JSON из базы данных и пытаюсь десериализовать его обратно в объект. Но объяснено ниже, он теряет свойства объекта после десериализации.

Мой код:

using (SqlConnection conn = new SqlConnection(PartsDatabase.connString)) {

                string query = @"SELECT [JSON] FROM parts WHERE [Id] = @id";

                using (SqlCommand sqlcommand = new SqlCommand(query, conn)) {

                    sqlcommand.Connection = conn;

                    conn.Open();

                    sqlcommand.Parameters.AddWithValue("@id", id);

                    MessageBox.Show(sqlcommand.ExecuteScalar().ToString());
                    Part p = JsonConvert.DeserializeObject<Part>(sqlcommand.ExecuteScalar().ToString());
                    MessageBox.Show(PartsDatabase.DisplayObjectInfo(p));

                    tb_PartNumber.Text = p.GetPartNumber();
                    cmb_revision.SelectedIndex = cmb_revision.FindString(p.GetRevision());
                    tb_partName.Text = p.GetPartName();
                    tb_workOrder.Text = p.GetWorkOrder();
                    tb_serialNo.Text = p.GetSerialNumber();
                    conn.Close();
                }
            }

Выход из MessageBox.Show(sqlcommand.ExecuteScalar().ToString());:

{"PartNumber":"20584","PartName":"FOO, BAR","Revision":"0","SerialNumber":"11111","WorkOrder":"22222"}

Вывод из моего метода отладки MessageBox.Show(PartsDatabase.DisplayObjectInfo(p));:

 System.String PartNumber = 
 System.String Revision = 0
 System.String PartName = FOO, BAR
 System.String WorkOrder = 22222
 System.String SerialNumber = 11111

My Part class

using System;
using System.Runtime.Serialization;
using Newtonsoft.Json;

namespace PartsDatabase {

    [Serializable]
    public class Part {

        [DataMember]
        public string PartNumber { get; private set; }
        [DataMember]
        public string PartName { get; private set; }
        [DataMember]
        public string Revision { get; private set; }
        [DataMember]
        public string SerialNumber { get; private set; }
        [DataMember]
        public string WorkOrder { get; private set; }

        public string GetPartNumber() {
            return PartNumber;
        }
        public void SetPartNumber(string value) {
            PartNumber = value;
        }
        public string GetPartName() {
            return PartName;
        }
        public void SetPartName(string value) {
            PartName = value;
        }
        public string GetRevision() {
            return Revision;
        }
        public void SetRevision(string value) {
            Revision = value;
        }
        public string GetSerialNumber() {
            return SerialNumber;
        }
        public void SetSerialNumber(string value) {
            SerialNumber = value;
        }
        public string GetWorkOrder() {
            return WorkOrder;
        }
        public void SetWorkOrder(string value) {
            WorkOrder = value;
        }

        [JsonConstructor]
        public Part(string workOrder, string partNumber, string revision, string partName, string serialNumber) {

            WorkOrder = workOrder;
            PartNumber = partNumber;
            Revision = revision;
            PartName = partName;
            SerialNumber = serialNumber;
        }
    }
}

Мой метод сериализации:

public static string serialize(Part p) {

            return JsonConvert.SerializeObject(p);
        }

Вы видите, что он теряет PartNumber после метода десериализации. Вызов Console.WriteLine(p.GetPartNumber()); выведет пустую строку. Что может быть не так? PartNumber - не единственное свойство, которое теряет объект, но мне пришлось усечь его для этого вопроса. Он теряет некоторые свойства, но не другие. Тем не менее, это соответствует, то есть это всегда одни и те же свойства, которые не могут десериализовать. Спасибо!

...