【问题标题】:Java: JSONObject.toString() - adding extra space after colon (":" -> ": ")Java: JSONObject.toString() - 在冒号后添加额外的空格 (":" -> ":")
【发布时间】:2015-09-24 11:59:57
【问题描述】:

搜索了一段时间,但没有发现任何有用的信息,因为关键字太常见了。

目前在我的 Java 代码方法 toString()(在一些 JSONObject 对象上调用)产生如下输出:

{"key_name":<numerical_value>}

而我需要的(由于项目另一端的解析器不完善)是:

{"key_name": <numerical_value>}

唯一的区别是冒号后面有多余的空格。是否有任何 JSONObject 内置方法可以做到这一点,或者我需要一些手写的简单字符串操作吗?

【问题讨论】:

  • 您好,您可以使用 ObjectMapper 类来解决问题。 toString() 不是解决问题的正确方法。
  • 为什么?我需要的正是一个字符串。这只是由另一个远程应用程序解析它的问题。我的应用程序生成 JSONObject 并将其作为 json 格式的字符串传输 - 这是其他各方提出并同意的协议。
  • 虽然这可能有效,但真正的解决方案当然是在另一端修复解析器。
  • 您的 JSONObject 占用了额外的空间,如果您觉得这是唯一的问题,请删除额外的空间。我觉得你应该使用 ObjectMapper 将 java 对象转换为 json,无需再次制作 JSONObject。
  • @Henry - 绝对正确,这是我们的第一个解决方案,也是唯一合适的解决方案。遗憾的是,目前无法实现,因此我们必须找到解决此问题的方法。

标签: java space tostring jsonobject colon


【解决方案1】:

我只能想象构建一个自定义 JSONStringer。事实上,它可能是使用StringWriter 构建的JSONWriter。然后你重写所有的value方法,在调用父类方法之前添加一个空格。

class JSONSpaceStringer extends JSONWriter {
    private StringWriter sw;

    JSONSpaceStringer(StringWriter sw) {
        parent(sw); // initialize parent
        this.sw = sw;
    }

    @Override
    public JSONWriter value(long l) throws JSONException {
        sw.write(" "); // add an initial space
        parent.value(l); // and let parent class do the job...
    }

// same for all other value methods
//...
}

【讨论】:

    【解决方案2】:

    使用下面的代码。它将帮助您解决问题。

     package com.javamad.utils;
    
        import java.io.IOException;
    
        import org.apache.log4j.Logger;
        import org.codehaus.jackson.JsonGenerationException;
        import org.codehaus.jackson.JsonParseException;
        import org.codehaus.jackson.map.JsonMappingException;
        import org.codehaus.jackson.map.ObjectMapper;
    
        public class JsonUtils {
    
            private static Logger logger = Logger.getLogger(JsonUtils.class.getName());
    
    
            public static <T> T jsonToJavaObject(String jsonRequest, Class<T> valueType)
                    throws JsonParseException, JsonMappingException, IOException {
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE,false);     
                T finalJavaRequest = objectMapper.readValue(jsonRequest, valueType);
                return finalJavaRequest;
    
            }
    
            public static String javaToJson(Object o) {
                String jsonString = null;
                try {
                    ObjectMapper objectMapper = new ObjectMapper();
                    objectMapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE,true);  
                    jsonString = objectMapper.writeValueAsString(o);
    
                } catch (JsonGenerationException e) {
                    logger.error(e);
                } catch (JsonMappingException e) {
                    logger.error(e);
                } catch (IOException e) {
                    logger.error(e);
                }
                return jsonString;
            }
    
        }
    

    【讨论】:

    • 远非回答我的问题。我需要的是一个使用 JSONObject 的漂亮解决方案 - 如果有一个漂亮的解决方案。仍在寻求帮助。