Как правильно преобразовать JSON в модель?

138
22 июня 2019, 22:00

Делаю запрос к API в формате JSON, необходимо преобразовать его в модель C#.

JSON:

{
  "type":"INDIVIDUAL",
  "country": "US",
  "profileFields":[
    {
      "fieldId": "individualLegalName",
      "value": "Johnny Quest"
    },
    {
      "fieldId": "individualEmail",
      "value": "JohnnyQuest22@yolo.com"
    },
    {
      "fieldId": "individualResidenceAddress",
      "value": {
        "street1": "1 Market St",
        "street2": "Suite 402",
        "city": "San Francisco",
        "state": "CA",
        "postalCode": "94105",
        "country": "US"
      }
    }
  ]
}

Сейчас отправляю как:

var body = new Dictionary<string, object>
{
    { "type", "INDIVIDUAL" },
    { "country", "US" },
    { "profileFields", "test@sendwyre.com" }
};

Хочу сделать через форму, думаю для этого подойдет создание модели.

Answer 1

У вас есть два пути.

Метод 1. XSD tool

Предположим, что ваш XML-файл тут: C:\path\to\xml\file.xml

  1. Откройте Командную Строку Разработчика Она находится Кнопка Пуск> Программы> Microsoft Visual Studio 2012 > Visual Studio Tools или если у вас Windows 8/10 просто начните печатать Командная Строка в меню Пуск
  2. Переместитесь в каталог вашего XML-файла, введя cd /D "C:\path\to\xml"
  3. Создайте XSD файл из вашего xml файла введяxsd file.xml
  4. Создайте C# классы введя xsd /c file.xsd

И это всё!
Вы сгенерировали C# классы из xml файла в C:\path\to\xml\file.cs

Метод 2 - Специальная вставка

Нужна Visual Studio 2012+

  1. Скопируйте содержимое XML-файла в буфер обмена
  2. Добавьте в ваш солюшн новый пустой файл класса (Shift+Alt+C)
  3. Откройте добавленный файл и в меню выберите Edit > Paste special > Paste JSON As Classes

И это всё!

Использование

Использовать очень просто с этим вспомогательным классом::

using System;
using System.IO;
using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;
namespace Helpers
{
    internal static class ParseHelpers
    {
        private static JavaScriptSerializer json;
        private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }
        public static Stream ToStream(this string @this)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(@this);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }

        public static T ParseXML<T>(this string @this) where T : class
        {
            var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
            return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
        }
        public static T ParseJSON<T>(this string @this) where T : class
        {
            return JSON.Deserialize<T>(@this.Trim());
        }
    }
}

Все что вам нужно сделать это:

 public class JSONRoot
    {
        public catalog catalog { get; set; }
    }
    // ...
    string xml = File.ReadAllText(@"D:\file.xml");
    var catalog1 = xml.ParseXML<catalog>();
    string json = File.ReadAllText(@"D:\file.json");
    var catalog2 = json.ParseJSON<JSONRoot>();

Причем так вы можете десереализовывать не только JSON но и XML это достаточно универсальное решение ¯\_(ツ)_/¯

я перевел ответ с английского so

READ ALSO
Как заменить содержимое Frame

Как заменить содержимое Frame

Есть окно "MainWindow", в нем Frame "Go" в который при запуске окна помещается "Page1", в "Page1" еще один Frame "Main", в котором лежит "Page2"

124
BitmapImage не работает с Binding?

BitmapImage не работает с Binding?

Интересная ситуация, при попытке установки значения для BitmapImageUriSource через привязку данных, вот так:

127
Как присвоить переменную типа Camera через метод Start()

Как присвоить переменную типа Camera через метод Start()

В скрипте есть переменная : public Camera PlayerCam; Через метод public void Start() {

105