谷歌搜索了一段时间但没有发现任何有用的东西,因为关键字太常见了。
目前在我的Java代码方法中
toString()
(调用一些JSONObject
对象)产生这样的输出:
{"key_name":<numerical_value>}
而我需要的(由于项目另一端的解析器不完善)是:
{"key_name": <numerical_value>}
唯一的区别是冒号后面有额外的空间。是否有任何
JSONObject
内置的方式来做到这一点,或者我需要一些手写的简单字符串操作吗?
我只能想象建立一个自定义
JSONStringer
。事实上,它可能是使用 JSONWriter
构建的 StringWriter
。然后你覆盖所有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
//...
}
使用下面的代码。它将帮助您解决问题。
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;
}
}
只需扩展 MinimalPrettyPrinter
public class TestObjectMapper2 {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue("{\"name\":\"frank\",\"age\":20,\"inq\":[\"2\",\"35\"]}",Person.class);
System.out.println(mapper.writer(new MinimalPrettyPrinter(){
@Override
public void writeObjectEntrySeparator(JsonGenerator jg)
throws IOException
{
jg.writeRaw(',');
jg.writeRaw(' ');
}
@Override
public void writeArrayValueSeparator(JsonGenerator jg)
throws IOException
{
jg.writeRaw(',');
jg.writeRaw(' ');
}
}).writeValueAsString(person));
}
private static class Person{
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
private String name;
private Integer age;
private List<String> inq;
public List<String> getInq()
{
return inq;
}
public void setInq(List<String> inq)
{
this.inq = inq;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
}
output: {"name":"frank", "age":20, "inq":["2", "35"]}