Как можно расшифровать похожие структуры JSON?

Я использую @glennsl bs-jsonмодуль для декодирования некоторых ответов JSON, но все ответы JSON имеют некоторые общие поля в дополнение к их уникальной полезной нагрузке. Кроме того, ответы JSON (через XMLHTTPRequest) различаются в зависимости от того, успешны они или нет: они не будут включать элемент.

Мне интересно, есть ли способ создать метод, позволяющий использовать декодер для обобщенного формата. Я думал что-то вроде:

      module Decode {
    type msgCheck = {
        success:    bool,
        command:    string,
        errmsg:     string,
        errnum:     int,
    };
    // type msgComplete('body) = {
    //     success:    bool,
    //     command:    string,
    //     errmsg:     string,
    //     errnum:     int,
    //     body:       'body,  /* This is what the incoming JSON looks like. */
    // }
    let msgCheck = json => Json.Decode.{
        success:    json |> field("success",        bool),
        command:    json |> field("command",        string),
        errmsg:     json |> field("error_string",   string),
        errnum:     json |> field("error",          int),
    };
    
    let jsonDecode = ('body, bodyDecoder, response) => {
        let msgCheck = response -> msgCheck;

        switch msgCheck.success {
            | true  => {
                let (r:'body) = response -> bodyDecoder;
                return (true, Some(r))  /* returning body (only) preferable. */
            }
            | false => {
                Js.log(msgCheck.errmsg);
                return (false, None)
            }
        }
    };
}

Есть ли способ создать шаблонный метод в reasonml? Или просто оберните 'body введите option элемент и использование optional() в field() звонки?

0 ответов

Другие вопросы по тегам