Groovy JsonBuilder с заглавными буквами в именах полей

Я использую Groovy JsonBuilder для создания JSON для отправки по HTTP. Моя проблема в том, что некоторые ключи на данной карте используются с заглавной буквы.

Я даю ему объект этого класса:

public class TestSNP {
    private String snpID;

    TestSNP(String input) {
        snpID = input.split("\\s+")[1];
    }

    String getSNPID() {
        return snpID;
    }
}

Это тест, который не проходит:

import groovy.json.*

class Test {
    @Test
        void jsonBuilderTest() {
            def testSNP = new TestSNP("1 rs444444 2 3")
            assert new groovy.json.JsonBuilder(testSNP).toString() == '{"snpID":"rs444444"}'
        }
}

я получил

{"SNPID":"rs444444"}

вместо того

{"snpID":"rs444444"}

(это упрощенный пример, демонстрирующий мою проблему)


person kiml42    schedule 09.12.2015    source источник
comment
@tim_yates Это, наверное, было бы полезно, не так ли. Я добавил строку, которая сейчас вызывает проблемы. Спасибо.   -  person kiml42    schedule 09.12.2015
comment
Ответ: это не ... Groovy не использует записи с заглавных букв. Они сохранят заглавные буквы в картах ... то есть: assert new groovy.json.JsonBuilder([[snps:[[snpID:'rs444444']]]]).toString() == '[{"snps":[{"snpID":"rs444444"}]}]' будет нормально работать в Groovy.   -  person tim_yates    schedule 09.12.2015
comment
Спасибо, это действительно работает. Проблема связана с моим классом: assert new groovy.json.JsonBuilder ([[snps: [new domain.SNP (1 rs444444 2 3)]]]). ToString () == '[{snps: [{ allele1: null, position: 2, valid: true, basePairCoordinate: 3, allele2: null, snpID: rs444444, chromasome: 1}]}] 'не работает. Я посмотрю, смогу ли я разработать упрощенный пример с той же проблемой, чтобы не помещать сюда весь свой класс.   -  person kiml42    schedule 09.12.2015
comment
Поле (или геттер) в вашем SNP классе называется SNPID или getSNPID?   -  person tim_yates    schedule 09.12.2015
comment
Да, именно в этом и проблема. Я решил это, собирая упрощенный пример, о котором сейчас идет речь. Я не предполагал, что ему придется использовать геттер, и поэтому догадываюсь, какие соглашения я использовал для именования переменных.   -  person kiml42    schedule 09.12.2015


Ответы (1)


Изменять:

String getSNPID() {
    return snpID;
}

to:

String getSnpID() {
    return snpID;
}

И он будет работать так, как вы ожидаете

person tim_yates    schedule 09.12.2015
comment
Также стоит отметить, что он также ищет методы isSomething () и добавляет логическую переменную something. - person kiml42; 09.12.2015
comment
Да, он соответствует спецификации Java Beans для именования геттеров :-) - person tim_yates; 09.12.2015