Как автоматически преобразовывать типы AWS в JSON [duplicate]

Мне нравится решение citykid. Я немного расширил его. Таким образом, решение также основано на методе когенерации с шаблонами T4.

Он может генерировать общие типы TypeScript и эмбиентные объявления.

Он поддерживает наследование и реализации интерфейса.

Поддерживает генераторы, массивы и списки как поля типа.

Также он переводит типы TypeScript, которые явно не упоминаются в конфигурации (например, мы импортируем тип A, а в выводе TS вы можете найти некоторые другие типы : типы полей, базовые типы и интерфейсы).

Вы также можете переопределить имя типа.

Также перечислены перечисления.

Пример использования (вы можете найти его в репозитории проекта):

// set extension of the generated TS file
<#@ output extension=".d.ts" #>

// choose the type of TS import TsMode.Ambient || TsMode.Class
<# var tsBuilder = new TsBuilder(TsMode.Ambient); #>

// reference assembly with the c# types to be transformed
<#@ assembly name="$(SolutionDir)artifacts\...\CsT4Ts.Tests.dll" #>

// reference namespaces
<#@ import namespace="CsT4Ts.Tests" #>
<#
    //add types to processing
    tsBuilder.ConsiderType(typeof(PresetDTOBase), "PresetBase");
    tsBuilder.ConsiderType(typeof(PresetDTO), "Preset");
    tsBuilder.ConsiderType(typeof(TestInterface<,>));
#>

// include file with transformation algorithms
<#@ include file="CsT4Ts.t4" #>

И вы получите выход

//CsT4Ts.Tests.PresetDTOBase => PresetBase
// CsT4Ts.Tests.PresetDTO => Preset
// CsT4Ts.Tests.TestInterface`2 => TestInterface
// CsT4Ts.Tests.TestEnum => TestEnum

declare class PresetBase
{
    PresetId: string;
    Title: string;
    InterviewDate: string;
}

declare class Preset extends PresetBase
{
    QuestionsIds: string[];
}

declare interface TestInterface
{
    A: string;
    B: number;
    C: TestEnum;
    D: TestEnum[];
    E: number[];
    F: TA;
    G: TB[];
}

declare enum TestEnum
{
    Foo = 10,
    Boo = 100
}

Проверьте полное решение здесь: https://bitbucket.org/ chandrush / cst4ts

3
задан Stéphane Bruckert 16 January 2017 в 21:22
поделиться

3 ответа

Используйте boto3 . Он доступен непосредственно в среде Lambda :

import boto3

DYNAMODB = boto3.resource('dynamodb')
DB_TABLE = DYNAMODB.Table('table_name')

item = {
    'key1': 'value1',
    'key2'" 'value2',
}

response = DB_TABLE.put_item(Item=item)
0
ответ дан blueCat 18 August 2018 в 13:00
поделиться

Я не мог найти ничего в дикой природе. Итак, я решил перенести реализацию PHP dynamodb json на стандартный json, который был опубликован здесь . Я протестировал это в python lambda, обрабатывая поток DynamoDB. Если есть лучший способ сделать это, сообщите мне.

(PS: Это не полный порт PHP Marshaler)

JSON в вопросе преобразуется в :

{  
   "feas":{  
      "fea":[  
         {  
            "pre":"1",
            "Mo":"1",
            "Ti":"20160618184156529",
            "Fa":"0",
            "Li":"1",
            "Fr":"4088682"
         }
      ]
   }
}

def unmarshalJson(node):
    data = {}
    data["M"] = node
    return unmarshalValue(data, True)


def unmarshalValue(node, mapAsObject):
    for key, value in node.items():
        if(key == "S" or key == "N"):
            return value
        if(key == "M" or key == "L"):
            if(key == "M"):
                if(mapAsObject):
                    data = {}
                    for key1, value1 in value.items():
                        data[key1] = unmarshalValue(value1, mapAsObject)
                    return data
            data = []
            for item in value:
                data.append(unmarshalValue(item, mapAsObject))
            return data
6
ответ дан Stéphane Bruckert 18 August 2018 в 13:00
поделиться

Обновление: теперь есть библиотека: https://pypi.org/project/dynamodb-json/


Вот улучшенная версия ответ indiangolfer . Хотя решение indiangolfer работает для этого вопроса, эта улучшенная версия может быть более полезной для других, которые наткнулись на этот поток.

def unmarshal_dynamodb_json(node):
    data = dict({})
    data['M'] = node
    return _unmarshal_value(data)


def _unmarshal_value(node):
    if type(node) is not dict:
        return node

    for key, value in node.items():
        # S – String - return string
        # N – Number - return int or float (if includes '.')
        # B – Binary - not handled
        # BOOL – Boolean - return Bool
        # NULL – Null - return None
        # M – Map - return a dict
        # L – List - return a list
        # SS – String Set - not handled
        # NN – Number Set - not handled
        # BB – Binary Set - not handled
        key = key.lower()
        if key == 'bool':
            return value
        if key == 'null':
            return None
        if key == 's':
            return value
        if key == 'n':
            if '.' in str(value):
                return float(value)
            return int(value)
        if key in ['m', 'l']:
            if key == 'm':
                data = {}
                for key1, value1 in value.items():
                    if key1.lower() == 'l':
                        data = [_unmarshal_value(n) for n in value1]
                    else:
                        if type(value1) is not dict:
                            return _unmarshal_value(value)
                        data[key1] = _unmarshal_value(value1)
                return data
            data = []
            for item in value:
                data.append(_unmarshal_value(item))
            return data

Это улучшено следующими способами:

  • обрабатывает больше типов данных , включая списки, которые ранее не обрабатывались правильно
  • обрабатывает строчные и прописные клавиши

Редактировать: исправить рекурсивный объект ошибка

7
ответ дан vekerdyb 18 August 2018 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: