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

ki1q1bka  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(258)

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

    • Avro型号类别**(目标):
@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

合同标识为空。
如果将破折号替换为下划线并删除.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
代码将返回正确的值。

u5i3ibmn

u5i3ibmn1#

如果字段被命名为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('_', '-'))

相关问题