Перейти к содержимому

JSON в Go структуру

Преобразует данные JSON в типы структур Go с тегами полей.

Об этом инструменте

JSON to Go Struct — это утилита для разработчиков, которая автоматически преобразует данные JSON в определения строго типизированных структур Go. Этот инструмент незаменим для программистов Go, работающих с JSON-API, файлами конфигурации или форматами обмена данными, исключая утомительный процесс ручного определения полей структуры и соответствующих тегов JSON.

Просто вставьте свои данные JSON в инструмент, и он мгновенно создаст код структуры Go с соответствующими типами полей, именами и тегами структуры (включая json, omitempty и другие распространённые теги). Сгенерированные структуры сохраняют исходную структуру JSON при обеспечении типобезопасности Go, что облегчает прямой парсинг JSON-ответов в типизированные структуры данных.

Этот инструмент особенно ценен при интеграции внешних API или использовании данных JSON третьих сторон со сложной или глубоко вложенной схемой. Он поддерживает опциональные поля, массивы, вложенные объекты и специальные типы данных, экономя разработчикам значительное время при интеграции API и снижая риск ошибок выполнения, вызванных несоответствием типов.

Часто задаваемые вопросы

Реализация кода

import json

def to_pascal_case(s: str) -> str:
    return ''.join(word.capitalize() for word in s.replace('-', '_').split('_'))

def json_to_go_type(value, field_name: str, structs: dict) -> str:
    if value is None:
        return "interface{}"
    if isinstance(value, bool):
        return "bool"
    if isinstance(value, int):
        return "int64"
    if isinstance(value, float):
        return "float64"
    if isinstance(value, str):
        return "string"
    if isinstance(value, list):
        if not value:
            return "[]interface{}"
        elem_type = json_to_go_type(value[0], field_name, structs)
        return f"[]{elem_type}"
    if isinstance(value, dict):
        struct_name = to_pascal_case(field_name)
        fields = []
        for k, v in value.items():
            field_type = json_to_go_type(v, k, structs)
            go_name = to_pascal_case(k)
            fields.append(f'\t{go_name} {field_type} `json:"{k}"`')
        structs[struct_name] = "type " + struct_name + " struct {\n" + "\n".join(fields) + "\n}"
        return struct_name
    return "interface{}"

def json_to_go(json_str: str, root_name: str = "Root") -> str:
    data = json.loads(json_str)
    structs = {}
    json_to_go_type(data, root_name, structs)
    return "\n\n".join(structs.values())

sample = '{"name": "Alice", "age": 30, "address": {"city": "Tokyo", "zip": "100-0001"}}'
print(json_to_go(sample))

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.