Как конвертировать JSON в C # классы? - PullRequest
6 голосов
/ 18 января 2011

У меня есть сложный объект JSON, который я хочу представить как класс C #. У меня есть преимущество в родительском классе под названием «Форма», но как я могу представить коллекцию для разных типов (см. Объект «elements» ниже)?

Вот объект JSON:

{
    "action": "index.html",
    "method": "post",
    "elements":
[
{
    "type": "fieldset",
    "caption": "User information",
    "elements":
    [
        {
            "name": "email",
            "caption": "Email address",
            "type": "text",
            "placeholder": "E.g. user@example.com",
            "validate":
            {
                "email": true
            }
        },
        {
            "name": "password",
            "caption": "Password",
            "type": "password",
            "id": "registration-password",
            "validate":
            {
                "required": true,
                "minlength": 5,
                "messages":
                {
                    "required": "Please enter a password",
                    "minlength": "At least {0} characters long"
                }
            }
        },
        {
            "name": "password-repeat",
            "caption": "Repeat password",
            "type": "password",
            "validate":
            {
                "equalTo": "#registration-password",
                "messages":
                {
                    "equalTo": "Please repeat your password"
                }
            }
        },
        {
            "type": "radiobuttons",
            "caption": "Sex",
            "name": "sex",
            "class": "labellist",
            "options":
            {
                "f": "Female",
                "m": "Male"
            }
        }
    ]
]
}

Класс, который я начал, выглядит так:

public class Form
{
    public Guid id
    {
        get;
        set;
    }

    public string action
    {
        get;
        set;
    }

    public string method
    {
        get;
        set;
    }

    public ??? elements
    {
        get;
        set;
    }

    public Form()
    {

    }
}

Как мне обработать свойство "elements", чтобы получить желаемый вывод JSON?

Я использую WCF 4.0 с этими атрибутами в web.config: automaticFormatSelectionEnabled = "false", defaultOutgoingResponseFormat = "Json". Буду признателен за любую помощь или идеи.

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011

Если вы не можете использовать динамические типы из .NET 4 или хотите использовать преимущества, которые предоставляет статическая типизация, проект JSON Class Generator в codeplex сгенерирует классы c # с учетомвходная строка json.(бесстыдный плагин) Я также взял код из этого проекта и добавил к нему веб-интерфейс .

1 голос
/ 18 января 2011

Ничего себе. Увлекательный вопрос. Может быть, использовать ExpandoObject / dynamic?

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx?PageIndex=4

Или анонимные типы, которые, я думаю, можно сериализовать с помощью встроенного сериализатора .NET JSON.

0 голосов
/ 20 декабря 2018

Вам не нужно пытаться создать структуру класса вручную.

Иногда это тоже довольно неприятно. :)

Существует команда Visual Studio, которую вы можете использовать (я думаю, vs2015 и более поздние версии):

  1. В новом файле класса нажмите Меню => Редактировать => Специальная вставка
  2. Выберите «Вставить JSON как классы»

Теперь конкретно в вашем JSON есть ошибка, вы пропускаете закрывающую фигурную скобку первого объекта "element".

Ниже приведен исправленный JSON:

{
  "action": "index.html",
  "method": "post",
  "elements": [
    {
      "type": "fieldset",
      "caption": "User information",
      "elements": [
        {
          "name": "email",
          "caption": "Email address",
          "type": "text",
          "placeholder": "E.g. user@example.com",
          "validate": {
            "email": true
          }
        },
        {
          "name": "password",
          "caption": "Password",
          "type": "password",
          "id": "registration-password",
          "validate": {
            "required": true,
            "minlength": 5,
            "messages": {
              "required": "Please enter a password",
              "minlength": "At least {0} characters long"
            }
          }
        },
        {
          "name": "password-repeat",
          "caption": "Repeat password",
          "type": "password",
          "validate": {
            "equalTo": "#registration-password",
            "messages": {
              "equalTo": "Please repeat your password"
            }
          }
        },
        {
          "type": "radiobuttons",
          "caption": "Sex",
          "name": "sex",
          "class": "labellist",
          "options": {
            "f": "Female",
            "m": "Male"
          }
        }
      ]
    }
  ]
}

и соответствующие классы:

public class Rootobject
{
    public string action { get; set; }
    public string method { get; set; }
    public Element[] elements { get; set; }
}

public class Element
{
    public string type { get; set; }
    public string caption { get; set; }
    public Element1[] elements { get; set; }
}

public class Element1
{
    public string name { get; set; }
    public string caption { get; set; }
    public string type { get; set; }
    public string placeholder { get; set; }
    public Validate validate { get; set; }
    public string id { get; set; }
    public string _class { get; set; }
    public Options options { get; set; }
}

public class Validate
{
    public bool email { get; set; }
    public bool required { get; set; }
    public int minlength { get; set; }
    public Messages messages { get; set; }
    public string equalTo { get; set; }
}

public class Messages
{
    public string required { get; set; }
    public string minlength { get; set; }
    public string equalTo { get; set; }
}

public class Options
{
    public string f { get; set; }
    public string m { get; set; }
}
0 голосов
/ 28 февраля 2011

Если вы просто хотите убедиться, что все эти неизвестные данные будут десериализованы и могут быть повторно сериализованы в какой-то момент в будущем, я предлагаю использовать IExtensibleDataObject.

Вот несколько примеров для начала.Надеюсь это поможет!(Если вы уже знали это и искали что-то другое ... дайте мне знать!)

Предварительно совместимые контракты данных

Управление версиями контрактов данных

Полезная поясняющая тема по теме на форумах MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...