如何将带破折号的 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('_', '-'))
我有一个 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('_', '-'))