【问题标题】:How to let jackson generate json string using single quote or no quotes?如何让杰克逊使用单引号或不使用引号生成json字符串?
【发布时间】:2012-12-10 06:00:53
【问题描述】:

比如我想为ng-style生成一个json字符串:

<th ng-style="{width:247}" data-field="code">Code</th>

但是有了杰克逊,结果是:

<th ng-style="{&quot;width&quot;:247}" data-field="code">Code</th>

读起来不容易。

所以我希望jackson 生成带单引号或不带引号的 json 字符串。可以这样做吗?

【问题讨论】:

  • 如果不使用引号或单引号,那不是 JSON。
  • 但是 jackson 可以解析 json 使用单引号或不使用引号作为键的字符串。
  • jackson 可以做几件不是 json 的事情

标签: json jackson double-quotes


【解决方案1】:

如果您可以控制 ObjectMapper 实例,则将其配置为按照您想要的方式处理和生成 JSON:

final ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

【讨论】:

    【解决方案2】:

    最简单也是最好的选择是使用正则表达式并更新字符串值。

    示例代码如下所示。

    partNumberList=partNumberList.replaceAll(":", ":\"").replaceAll("}", "\"}");

    完整代码如下图

    public static void main(String[] args) throws JsonParseException, JsonMappingException, 
        IOException {
        TestJack obj = new TestJack();
        //var jsonString ='{"it":"Stati Uniti d'America"}';
        //            jsonString =jsonString.replace("'", "\\\\u0027")
        ObjectMapper mapper = new ObjectMapper();
        String partNumberList = "[{productId:AS101R}, {productId:09902007}, {productId:09902002}, {productId:09902005}]";
        partNumberList = partNumberList.replaceAll(":", ":\"").replaceAll("}", "\"}");
        System.out.println(partNumberList);
        mapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
        List<ProductDto> jsonToPersonList = null;
        jsonToPersonList = mapper.readValue(partNumberList, new TypeReference<List<ProductDto>>() {
        });
        System.out.println(jsonToPersonList);
    }
    

    【讨论】:

    • 你应该避免这个解决方案并做类似的事情 - 所有的转义序列都将被逐字处理 - 如果有一个转义的双引号或包含单引号,你可能会得到一个非法值 - YIKES !
    【解决方案3】:
    JsonGenerator.Feature.QUOTE_FIELD_NAMES
    

    已弃用,您可以改用它:

    mapper.configure(JsonWriteFeature.QUOTE_FIELD_NAMES.mappedFeature(), false);
    mapper.configure(JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES.mappedFeature(), true);
    

    请注意,JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES 并未被弃用(截至目前),此处提及相应的 JsonReadFeature 只是为了完整。

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2013-11-21
      • 1970-01-01
      • 2011-06-05
      • 2015-12-12
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多