AlwzLearning Ответов: 1

Сериализация JSON в объект


Привет,

У меня есть json:

{"envelope":{"headers":{"test.source":"source system", "test.agency":"test", "test.entity":"Plan", "test.revisionHistory":{"test.createdBy":"admin", "test.createTimeStamp":"2017-08-09T00:00:00", "test.updatedBy":"admin", "test.updatedTimeStamp":"2017-08-09T00:00:00"}, "test.identifiers":{"test.PlanId":"10000001"}}, "triples":[], "instance":{"PlanId":"10000001", "PlanName":"The Health Plan", "PlanType":"Discount Plan", "MailingState":"CA ", "MailingZipCode":"99999-1503", "MailingAddress":"Some Name LLP, 350 South Street Ave., 13th Floor", "MailingCity":"Los Angeles", "MonitoringExaminer":{"examinerName":"abc", "examinerEmail":"abc@test.ca.gov", "examinerPhone":"916-222-2222"}, "planContact":{"ContactName":"xyz", "ContactEmail":"xyz@Plan.com", "eFileContactPhone":"916-111-1111"}, "testLicensingContact":{"licensingContactName":"xyz", "licensingContactEmail":"xyz@test.ca.gov", "licensingContactPhone":"916-111-1111"}, "financialContact":{"financialContactName":"Jack Doe", "financialContactEmail":"xyz@Plan.com", "financialContactPhone":"916-111-1111"}}, "attachments":null}}


ОБНОВЛЕНИЕ: Форматированная версия (с использованием JSON Formatter & Validator[^]) для более легкого чтения...
{
   "envelope":{
      "headers":{
         "test.source":"source system",
         "test.agency":"test",
         "test.entity":"Plan",
         "test.revisionHistory":{
            "test.createdBy":"admin",
            "test.createTimeStamp":"2017-08-09T00:00:00",
            "test.updatedBy":"admin",
            "test.updatedTimeStamp":"2017-08-09T00:00:00"
         },
         "test.identifiers":{
            "test.PlanId":"10000001"
         }
      },
      "triples":[

      ],
      "instance":{
         "PlanId":"10000001",
         "PlanName":"The Health Plan",
         "PlanType":"Discount Plan",
         "MailingState":"CA ",
         "MailingZipCode":"99999-1503",
         "MailingAddress":"Some Name LLP, 350 South Street Ave., 13th Floor",
         "MailingCity":"Los Angeles",
         "MonitoringExaminer":{
            "examinerName":"abc",
            "examinerEmail":"abc@test.ca.gov",
            "examinerPhone":"916-222-2222"
         },
         "planContact":{
            "ContactName":"xyz",
            "ContactEmail":"xyz@Plan.com",
            "eFileContactPhone":"916-111-1111"
         },
         "testLicensingContact":{
            "licensingContactName":"xyz",
            "licensingContactEmail":"xyz@test.ca.gov",
            "licensingContactPhone":"916-111-1111"
         },
         "financialContact":{
            "financialContactName":"Jack Doe",
            "financialContactEmail":"xyz@Plan.com",
            "financialContactPhone":"916-111-1111"
         }
      },
      "attachments":null
   }
}


Что я уже пробовал:

Привет ,

Как преобразовать JSON в объект с помощью десериализатора ?

1 Ответов

Рейтинг:
9

Graeme_Grant

Первое, что нужно сделать, это создать структуру класса для преобразования JSON. Вы можете использовать
1. ‘Вставить JSON в качестве классов визуальная студия надстройки[^]; или
2. веб-инструмент типа JSON Utils[^]

#2 выше-мой личный фаворит, так как у вас есть больший контроль над генерируемым кодом. Вставка вашего JSON в этот инструмент веб-сайта генерирует следующую структуру классов:

public class TestRevisionHistory
    {
        [JsonProperty("test.createdBy")]
        public string TestCreatedBy { get; set; }

        [JsonProperty("test.createTimeStamp")]
        public DateTime TestCreateTimeStamp { get; set; }

        [JsonProperty("test.updatedBy")]
        public string TestUpdatedBy { get; set; }

        [JsonProperty("test.updatedTimeStamp")]
        public DateTime TestUpdatedTimeStamp { get; set; }
    }

    public class TestIdentifiers
    {
        [JsonProperty("test.PlanId")]
        public string TestPlanId { get; set; }
    }

    public class Headers
    {
        [JsonProperty("test.source")]
        public string TestSource { get; set; }

        [JsonProperty("test.agency")]
        public string TestAgency { get; set; }

        [JsonProperty("test.entity")]
        public string TestEntity { get; set; }

        [JsonProperty("test.revisionHistory")]
        public TestRevisionHistory TestRevisionHistory { get; set; }

        [JsonProperty("test.identifiers")]
        public TestIdentifiers TestIdentifiers { get; set; }
    }

    public class MonitoringExaminer
    {
        [JsonProperty("examinerName")]
        public string ExaminerName { get; set; }

        [JsonProperty("examinerEmail")]
        public string ExaminerEmail { get; set; }

        [JsonProperty("examinerPhone")]
        public string ExaminerPhone { get; set; }
    }

    public class PlanContact
    {
        [JsonProperty("ContactName")]
        public string ContactName { get; set; }

        [JsonProperty("ContactEmail")]
        public string ContactEmail { get; set; }

        [JsonProperty("eFileContactPhone")]
        public string EFileContactPhone { get; set; }
    }

    public class TestLicensingContact
    {
        [JsonProperty("licensingContactName")]
        public string LicensingContactName { get; set; }

        [JsonProperty("licensingContactEmail")]
        public string LicensingContactEmail { get; set; }

        [JsonProperty("licensingContactPhone")]
        public string LicensingContactPhone { get; set; }
    }

    public class FinancialContact
    {
        [JsonProperty("financialContactName")]
        public string FinancialContactName { get; set; }

        [JsonProperty("financialContactEmail")]
        public string FinancialContactEmail { get; set; }

        [JsonProperty("financialContactPhone")]
        public string FinancialContactPhone { get; set; }
    }

    public class Instance
    {
        [JsonProperty("PlanId")]
        public string PlanId { get; set; }

        [JsonProperty("PlanName")]
        public string PlanName { get; set; }

        [JsonProperty("PlanType")]
        public string PlanType { get; set; }

        [JsonProperty("MailingState")]
        public string MailingState { get; set; }

        [JsonProperty("MailingZipCode")]
        public string MailingZipCode { get; set; }

        [JsonProperty("MailingAddress")]
        public string MailingAddress { get; set; }

        [JsonProperty("MailingCity")]
        public string MailingCity { get; set; }

        [JsonProperty("MonitoringExaminer")]
        public MonitoringExaminer MonitoringExaminer { get; set; }

        [JsonProperty("planContact")]
        public PlanContact PlanContact { get; set; }

        [JsonProperty("testLicensingContact")]
        public TestLicensingContact TestLicensingContact { get; set; }

        [JsonProperty("financialContact")]
        public FinancialContact FinancialContact { get; set; }
    }

    public class Envelope
    {
        [JsonProperty("headers")]
        public Headers Headers { get; set; }

        [JsonProperty("triples")]
        public IList<object> Triples { get; set; }

        [JsonProperty("instance")]
        public Instance Instance { get; set; }

        [JsonProperty("attachments")]
        public object Attachments { get; set; }
    }

    public class Response
    {
        [JsonProperty("envelope")]
        public Envelope Envelope { get; set; }
    }

Гнездо необходимо сопоставить исходные данные JSON в классовой структуре. Опять же, там есть несколько библиотек:
1. Собственные функции Майкрософт : Как сериализовать и десериализовать данные JSON | Microsoft Docs[^];
2. fastJSON[^]; или
3. Json.NET - Newtonsoft[^]

#3-мой личный фаворит, поскольку он позволяет поддерживать сложную пользовательскую сериализацию. Для этого решения я буду использовать #3. Вы можете добавить его в свой проект с помощью NuGet: Галерея NuGet | Json.NET 10.0.3[^] а вот и мой вспомогательный класс:
public static class JsonConverter
{
    public static string FromClass<T>(T data, bool isEmptyToNull = false, JsonSerializerSettings jsonSettings = null)
    {
        string response = string.Empty;
 
        if (!EqualityComparer<T>.Default.Equals(data, default(T)))
            response = JsonConvert.SerializeObject(data, jsonSettings);
 
        return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
    }
 
    public static T ToClass<T>(string data, JsonSerializerSettings jsonSettings = null)
    {
        var response = default(T);
 
        if (!string.IsNullOrEmpty(data))
            response = jsonSettings == null
                ? JsonConvert.DeserializeObject<T>(data)
                : JsonConvert.DeserializeObject<T>(data, jsonSettings);
 
        return response;
    }
}

Затем использовать с вышеперечисленными классами:
string rawJson = "{\"envelope\":{\"headers\":{\"test.source\":\"source system\", \"test.agency\":\"test\", \"test.entity\":\"Plan\", \"test.revisionHistory\":{\"test.createdBy\":\"admin\", \"test.createTimeStamp\":\"2017-08-09T00:00:00\", \"test.updatedBy\":\"admin\", \"test.updatedTimeStamp\":\"2017-08-09T00:00:00\"}, \"test.identifiers\":{\"test.PlanId\":\"10000001\"}}, \"triples\":[], \"instance\":{\"PlanId\":\"10000001\", \"PlanName\":\"The Health Plan\", \"PlanType\":\"Discount Plan\", \"MailingState\":\"CA \", \"MailingZipCode\":\"99999-1503\", \"MailingAddress\":\"Some Name LLP, 350 South Street Ave., 13th Floor\", \"MailingCity\":\"Los Angeles\", \"MonitoringExaminer\":{\"examinerName\":\"abc\", \"examinerEmail\":\"abc@test.ca.gov\", \"examinerPhone\":\"916-222-2222\"}, \"planContact\":{\"ContactName\":\"xyz\", \"ContactEmail\":\"xyz@Plan.com\", \"eFileContactPhone\":\"916-111-1111\"}, \"testLicensingContact\":{\"licensingContactName\":\"xyz\", \"licensingContactEmail\":\"xyz@test.ca.gov\", \"licensingContactPhone\":\"916-111-1111\"}, \"financialContact\":{\"financialContactName\":\"Jack Doe\", \"financialContactEmail\":\"xyz@Plan.com\", \"financialContactPhone\":\"916-111-1111\"}}, \"attachments\":null}}";

var result = JsonConverter.ToClass<Response>(rawJson);


AlwzLearning

Большое вам спасибо за прекрасный ответ. Я знал, что неправильно создаю структуру классов. Ваш класс JSONConverted просто потрясающий. спасибо еще раз.

Пока я пытался понять, у меня было несколько вопросов, таких как :

1. каковы будут настройки JSON ? можете ли вы привести какой-нибудь пример, например, какие настройки можно установить и как они полезны
2. при использовании инструмента есть ли шанс, что мы можем пропустить какое-то свойство, если оно равно нулю?
3 .я пытаюсь создать проект с использованием MVC и хочу, чтобы вы посоветовали мне то же самое : проект, над которым я работаю, полностью посвящен потреблению API, и я хотел бы знать, как лучше всего хранить API.. должен ли я сохранить его как другой проект и ссылаться на этот проект в mvc или я могу сохранить его в том же проекте, что и mvc

Graeme_Grant

Добро пожаловать. В данный момент я пишу статью CodeProject, которая будет описана гораздо более подробно. Но пока:
1. Настройки Сериализации[^]
2.это зависит от вашей структуры класса для десериализации - вышеупомянутые данные JSON имеют объект "тройки" пустым, поэтому тип класса неизвестен и задан как объект - вы можете либо исправить это с помощью упомянутого инструмента с новым набором данных, включая "тройки", либо вручную создать класс(ы) самостоятельно. Для сериализации, если вы не хотите сериализовать поле, просто используйте Атрибут [JsonIgnore] [^]. "Настройки сериализации" также имеют некоторые другие варианты для вас, однако мне никогда не приходилось их использовать - настройки по умолчанию работают нормально.
3. я храню все свои библиотеки и классы" API Service " в отдельной библиотеке и добавляю ссылку на проект, над которым работаю. Сохраняет его чистым и многоразовым для других проектов.

Надеюсь, это поможет! :)

AlwzLearning

Спасибо

AlwzLearning

Привет, Graeme_Grant, мне снова нужна ваша помощь. Класс "Response", к которому был сопоставлен json, я пытаюсь привязать этот класс к просмотру в MVC, но он не устанавливает значения.
Разве я не должен использовать тот же класс, что и модель в представлении ? Как мне сопоставить эти результаты с представлением?
Спасибо :)

AlwzLearning

Не берите в голову. Я связывал его неправильно. Мне удалось успешно связать его.
Спасибо

Graeme_Grant

Извините, спал... Рад слышать, что у вас все получилось ;)

Graeme_Grant

К вашему сведению, я наконец закончил и опубликовал статью: Работа с JSON в C# и VB[^]- надеюсь, это поможет! :)

BillWoodruff

+5 должны проголосовать за это "героическое" решение, даже если вы " Санта-Клаус" :)

Graeme_Grant

Это выглядит как много, но на самом деле это не так. ;)