Ruby Карта Сложен Вложенный JSON в мой собственный Ruby Класс? - PullRequest
1 голос
/ 27 февраля 2020

Мне нужно иметь возможность отобразить сложный вложенный json из результата API в мое собственное представление класса. Также необходимо иметь возможность редактировать данные и отправлять их обратно в API как json.

Пробовал поиск по этому вопросу ранее. Мог только найти, как сопоставить с OpenStruct.

На других языках, таких как C#, я могу сделать что-то вроде этого:

public class SomeViewModel
        {
public SomeViewModel(){
            A = new AViewModel();
            B = new BViewModel();
            Cs = new List<C>();
        }

        public string D {get; set;}
}

Где A, B и C сложные типы (могут содержать другие свойства других типов классов, массивы типов классов и т. д. c). Затем я мог бы использовать несколько библиотек, чтобы отобразить запрос JSON на SomeViewModel и получить доступ ко всем свойствам и методам. Нужно сделать то же самое в Ruby.

My JSON содержит много объектов и массив объектов. В некоторых ситуациях это объекты с массивами объектов (массивы объектов также могут содержать массивы объектов) и вложенные массивы (которые также могут содержать объекты и массивы объектов). Теперь я знаю, что могу использовать синтаксическую нотацию ha sh, но тогда мне придется отображать каждую пару kv индивидуально. Я уверен, что в Ruby?

есть более DRY -последовательность. Допустим, здесь есть фрагмент JSON (значительно уменьшенный, так как фактический JSON Слишком большой и может в любом случае я не могу использовать реальные данные):

"SomeViewModel": {
    "Bank": {
        "ID": 585263,
        "BankName": "First Bank of CA",
        "Drawer": null,
        "LockDate": "2020-02-24T08:45:13.507",
        "BankerPartyID": "9EE7AE0A-4001",
        "BankNumber": 4090466,
        "BusinessPolicyID": 21,
        "VersionNumber": "b5e8f11d-38cc-4861-9701-78e61a8f47d9",
        "RepositoryName": null,
        "IsBankToConvert": false,
        "CreatedBy": null,
        "ServerRootPath": null,
        "SubmissionNumber": null,
        "ReasonId": null,
        "BankNotes": [], # Blank but coul also be an array of objects
    },
    "BankRequest": {
        "BankHolder": null,
        "BankTeam": null,
        "PrimaryBanker": null,
    },
    "Customers": [{
            "Name": "Dave"
            "Phone": "555-555-5555"
        }, {
            "Name": "Bob"
            "Phone": "555-555-5555"
        }
    ],
    "CurrentBankContract": {
        "BankHolder": {
            "BankHolderID": 1303164,
            "SubscribingBankers": [{
                    "ElementGUID": "hihrwigohw-923489709724-jkflnanf3",
                    "ContractBankID": 1257638,
                }, {
                    "ElementGUID": "4545ojoj-923489709724-jkflnanf3",
                    "ContractBankID": 1257456,
                }
            ],
            "BankNew": false,
            "BankID": 585263,
        },
        "BankerTeam": {
            "ContractBankerTeamMemberID": 5432605,
            "Type": 1,
            "SubscribingBanker": {
                "ElementGUID": "45363-gsgsfdr-34525",
                "ContractBankComponentID": 1257638,
            },
            "BankID": 585263,
        }
    }
}

Мне нужно отобразить SomeViewModel и все его содержимое. Теперь для атрибута типа BankNotes, хотя он является атрибутом класса Bank, он действительно является массивом типа BankNote. Поэтому вместо класса с именем BankNotes у меня был бы класс с именем BankNote, и я хотел бы отобразить эту часть таким образом, чтобы BankNotes мог быть массивом типа BankNote и иметь доступ ко всем методам в классе BankNote. В любом случае, чтобы сопоставить комплекс JSON с моим собственным Ruby классом?

1 Ответ

0 голосов
/ 27 февраля 2020

Как я понял, ваша цель - синтаксический анализ json объекта?

Вот ваш json (отредактированный):

{
    "Bank": {
        "ID": 585263,
        "BankName": "First Bank of CA",
        "Drawer": null,
        "LockDate": "2020-02-24T08:45:13.507",
        "BankerPartyID": "9EE7AE0A-4001",
        "BankNumber": 4090466,
        "BusinessPolicyID": 21,
        "VersionNumber": "b5e8f11d-38cc-4861-9701-78e61a8f47d9",
        "RepositoryName": null,
        "IsBankToConvert": false,
        "CreatedBy": null,
        "ServerRootPath": null,
        "SubmissionNumber": null,
        "ReasonId": null,
        "BankNotes": []
    },
    "BankRequest": {
        "BankHolder": "Hello, I'm bankholder from JSON!",
        "BankTeam": null,
        "PrimaryBanker": null
    },
    "Customers": [{
        "Name": "Dave",
        "Phone": "555-555-5555"
    }, {
        "Name": "Bob",
        "Phone": "555-555-5555"
    }],
    "CurrentBankContract": {
        "BankHolder": {
            "BankHolderID": 1303164,
            "SubscribingBankers": [{
                "ElementGUID": "hihrwigohw-923489709724-jkflnanf3",
                "ContractBankID": 1257638
            }, {
                "ElementGUID": "4545ojoj-923489709724-jkflnanf3",
                "ContractBankID": 1257456
            }],
            "BankNew": false,
            "BankID": 585263
        },
        "BankerTeam": {
            "ContractBankerTeamMemberID": 5432605,
            "Type": 1,
            "SubscribingBanker": {
                "ElementGUID": "45363-gsgsfdr-34525",
                "ContractBankComponentID": 1257638
            },
            "BankID": 585263
        }
    }
}

Код, который анализирует JSON объекта :

require "json"
require "hashie"

file = File.read("example.json")
hash = JSON.parse(file, object_class: OpenStruct)
json_object = Hashie::Mash.new hash
json_object.BankRequest.BankHolder #=> "Hello, I'm bankholder from JSON!"

Что я здесь сделал:

  1. Читаемый элемент по классу файла
  2. Анализ JSON для OpenStruct и
  3. Созданный объект от ha sh
  4. Выходное значение

Как видите, json_object - это класс с собственными методами. Каждый ключ является собственным методом, который может содержать другие собственные методы et c

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