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

Java 如何将带破折号的Json字段转换为带下划线的Avro字段?,java,json,gson,avro,Java,Json,Gson,Avro,我有一个带有json的字符串,其属性包含破折号。我想将其转换为带有下划线字段的Avro对象。我试图使用Gson库,但得到的是null而不是值 Avro车型类别(目标): JSON(来源): 转换: final Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES) .setFieldNamingStrategy(new Packag

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

Avro车型类别(目标):

JSON(来源):

转换

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 
我的合同id为null

如果破折号替换为下划线,并且
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_与破折号)
已删除

代码返回正确的值。

Policy
FieldNamingPolicy。如果字段名为
constract
,则小写字母带破折号将起作用。因为不是这样,所以您需要定义自己的
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('_', '-'))

非常感谢你
Gson gson = new GsonBuilder()
    .setFieldNamingStrategy(new MyStrategy())
    .create();
.setFieldNamingStrategy( f ->  f.getName().replace('_', '-'))