【问题标题】:How to convert all keys in JSON response to uppercase? (JAVA)如何将 JSON 响应中的所有键转换为大写? (JAVA)
【发布时间】:2016-01-08 13:07:22
【问题描述】:

例如,我有以下 json 响应:

{
    StaTuS:succees,
    LanGuaGes: {
          Key1: English,
          key2: Spanish,
          kEy3: Indian
    }
} 

响应可以有许多嵌套元素。我想知道我们如何以这样一种方式进行编码,以便在我的响应中将所有键都转换为大写,以便它与我在 POJO 类中使用的命名约定相匹配。

像这样:

{
   STATUS:succees,
   LANGUAGES: {
          KEY1: English,
          KEY2: Spanish,
          KEY3: Indian
   }
} 

【问题讨论】:

  • 您可以编写一个正则表达式来查找所有以 : 结尾的单词并将它们转换为大写,但要正确执行此操作,您应该使用 JSON 解析器,尽管这会改变格式。
  • @Peter Lawrey 还有其他方法吗?喜欢使用 JsonNode 或 ObjectNode?或 JSON/JACKSON 库中可用的任何此类节点。
  • 如果您已经在使用解析器,我会使用它。

标签: java json jackson key pojo


【解决方案1】:

您可以使用自定义的 PropertyNamingStrategy:

public class UpperCaseStrategy extends PropertyNamingStrategyBase {

    @Override
    public String translate(String propertyName) {

        return propertyName.toUpperCase();
    }

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new CustomNamingStrategy());

请参阅here 以供参考。

作为注释,com.fasterxml.jackson.databind.PropertyNamingStrategy 中实现了小写策略,如下所示:

/**
 * Simple strategy where external name simply only uses lower-case characters,
 * and no separators.
 * Conversion from internal name like "someOtherValue" would be into external name
 * if "someothervalue".
 * 
 * @since 2.4
 */
public static class LowerCaseStrategy extends PropertyNamingStrategyBase
{
    @Override
    public String translate(String input) {
        return input.toLowerCase();
    }
}

【讨论】:

  • 实际上问题是我可以从客户端接收任何格式的 json 响应(大写,小写,每个单词大写)。您发布的答案会将我的 POJO 类中的命名策略转换为任何一种格式。但我想转换 json 响应以匹配我的 POJO 类命名策略。我希望你明白我的意思。谢谢你的帮助。
【解决方案2】:

我知道这是一个老问题,但万一它有帮助。

public JsonArray jsonKeysUpper(JsonArray arr) {
    JsonArray aux = new JsonArray();
    for(int i = 0; i < arr.size(); ++i)
        aux.add(jsonKeysUpper(arr.get(i).getAsJsonObject()));
    return aux;
}

public JsonObject jsonKeysUpper(JsonObject obj) {
    JsonObject aux = new JsonObject();
    if(obj.isJsonPrimitive()) return obj;
    if(obj.isJsonNull()) return null;
    // Iterate all properties
    for(String o : obj.keySet()) {
        if(obj.get(o).isJsonPrimitive())
            aux.addProperty(o.toUpperCase(), obj.get(o).getAsString());
        else if(obj.get(o).isJsonArray())
            aux.add(o.toUpperCase(), jsonKeysUpper(obj.get(o).getAsJsonArray()));
        else
            aux.add(o.toUpperCase(), jsonKeysUpper(obj.get(o).getAsJsonObject()));
    }
    return aux;
}

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2019-12-15
    • 1970-01-01
    • 2023-02-15
    相关资源
    最近更新 更多