如何将带破折号的 Json 字段转换为带下划线的 Avro 字段?

How to convert Json fields with dashes to Avro fields with underscores?

我有一个 json 的字符串,其属性包含破折号。我想将它转换为带有带下划线的字段的 Avro 对象。我尝试使用 Gson 库,但得到的是空值而不是值。

Avro 模型 class(目标):

@AvroGenerated
public class Contract extends SpecificRecordBase implements SpecificRecord {
    public static final Schema SCHEMA$ = (new Parser()).parse("....."});

    @Deprecated
    public String contract_id;

    public static Schema getClassSchema() {
        return SCHEMA$;
    }

JSON(来源):

{"contract-id": "1372b63a_7c6a_4929_a99b_199fa870edc0"}

正在转换:

final Gson gson  = new GsonBuilder()
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
        .setFieldNamingStrategy(new PackageFieldNamingStrategy())
        .registerTypeAdapter(Double.class, new DoubleSerializer())
        .create();

Contract avroObject = GSON_SERIALIZER.fromJson(data);

// printing avroObject.contract_id 

我得到 contract_id 的空值。

如果将破折号替换为下划线并.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)删除
代码 returns 正确值。

如果该字段被命名为 contractId,策略 FieldNamingPolicy.LOWER_CASE_WITH_DASHES 将起作用。因为它不是那么你需要定义一个你自己的FieldNamingStrategy,例如像:

public static class MyStrategy implements FieldNamingStrategy {
    @Override
    public String translateName(Field f) {
        return f.getName().replace('_', '-');
    }        
}

并像这样使用它:

Gson gson = new GsonBuilder()
    .setFieldNamingStrategy(new MyStrategy())
    .create();

或者只是在构建 Gson 时,内联而无需额外 类:

.setFieldNamingStrategy( f ->  f.getName().replace('_', '-'))