【问题标题】:Deserialising JSON with underscores to camel case in Java using Jackson? [duplicate]使用Jackson将带有下划线的JSON反序列化为Java中的驼峰式大小写? [复制]
【发布时间】:2016-12-13 02:13:19
【问题描述】:

要将具有驼峰式属性的 java 对象序列化为带下划线的 json,我们使用 PropertyNamingStrategy 作为 SNAKE_CASE

那么,是否也可以做相反的事情。也就是将带下划线的json反序列化为驼峰式的Java对象。

例如, 这个 JSON:

{
    "user_id": "213sdadl"
    "channel_id": "asd213l"
}

应该被反序列化为这个 Java 对象:

public class User {
    String userId; // should have value "213sdadl"
    String channelId; // should have value "asd213l"
}

我知道 one way of doing this 是通过 @JsonProperty 注释在字段级别工作的。我有兴趣了解这方面的任何全局设置。

【问题讨论】:

  • @JLewkovich 这不完全是重复的。请阅读问题的最后一行。我不是在谈论 @JsonProperty 注释,这是那里公认的答案。
  • 实际提到的问题确实有您可能感兴趣的答案,请查看最高投票的答案
  • @Quadrat137 是的,我已经看到了答案,您也可以在答案下方看到我的 cmets。它对我来说不是双向的。这是我的问题。

标签: java json jackson


【解决方案1】:

好吧,你可以有一个 PropertyNamingStrategy 的实现,看起来像这样:

import org.codehaus.jackson.map.MapperConfig;
import org.codehaus.jackson.map.PropertyNamingStrategy;
import org.codehaus.jackson.map.introspect.AnnotatedField;
import org.codehaus.jackson.map.introspect.AnnotatedMethod;

public class CustomNameStrategy extends PropertyNamingStrategy {
    @Override
    public String nameForField(MapperConfig config, AnnotatedField field, String defaultName) {
        return convert(defaultName);
    }

    @Override
    public String nameForGetterMethod(MapperConfig config, AnnotatedMethod method, String defaultName) {
        return convert(defaultName);
    }

    @Override
    public String nameForSetterMethod(MapperConfig config, AnnotatedMethod method, String defaultName) {
        return convert(defaultName);
    }

    public String convert(String defaultName) {
        char[] arr = defaultName.toCharArray();
        StringBuilder nameToReturn = new StringBuilder();

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == '_') {
                nameToReturn.append(Character.toUpperCase(arr[i + 1]));
                i++;
            } else {
                nameToReturn.append(arr[i]);
            }
        }
        return nameToReturn.toString();
    }
}

然后在您的实现或进行反序列化的类中,您可以拥有:

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(new CustomNameStrategy());
YourClass yourClass = mapper.readValue(yourJsonString, YourClass.class);

【讨论】:

  • 我接受这个答案,因为这是迄今为止我得到的唯一解决方案,我认为没有其他干净的方法可以做到这一点。
  • Jackson 只使用 propertyNamingStrategy 进行序列化,这太疯狂了
  • @AdamSiemion 现在我们可以在用户类之前放置注释@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)。现在我们将把snake_case json 自动翻译成camelCase 字段。
  • @standalone 不能使用带有默认配置的最新 Spring Boot 稳定版本 (2.5.6) 进行反序列化
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2020-01-08
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多