使用特定语法将Java对象转换为JSON
我想将Java对象转换为JSON字符串。假设对象看起来像这样:使用特定语法将Java对象转换为JSON,java,json,serialization,Java,Json,Serialization,我想将Java对象转换为JSON字符串。假设对象看起来像这样: public class User{ private Long id; private String firstName; } json应该是这样的: { "inputFields":[ { "name":"id", "value":"123" }, { "name":"firstName
public class User{
private Long id;
private String firstName;
}
json应该是这样的:
{
"inputFields":[
{
"name":"id",
"value":"123"
},
{
"name":"firstName",
"value":"George"
}
]
}
试图使用Jackson,但它似乎没有提供这种序列化 创建一个
InputFields
类,并在转换为json之前将用户
对象数据移动到该类中
编辑:InputFields类显然与所需的json结果具有相同的结构。Jackson可以使用自定义序列化程序,您可以在其中控制生成输出。 以下是执行此操作的步骤: 注释POJO以使用自定义序列化程序
@JsonSerialize(using = CustomSerializer.class)
static class User{
public Long id;
public String firstName;
public User(Long id, String firstName) {
this.id = id;
this.firstName = firstName;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
声明序列化程序
static class CustomSerializer extends JsonSerializer{
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeArrayFieldStart("inputFields");
Field[] fields = value.getClass().getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
jgen.writeStartObject();
jgen.writeObjectField("name", field.getName());
jgen.writeObjectField("value", field.get(value));
jgen.writeEndObject();
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
jgen.writeEndArray();
jgen.writeEndObject();
}
}
简单的测试
public static void main(String[] args) throws JsonProcessingException {
User user = new User(1L, "Mike");
ObjectMapper om = new ObjectMapper();
om.writeValueAsString(user);
System.out.println(om.writeValueAsString(user));
}
输出将是
{"inputFields":[{"name":"id","value":1},{"name":"firstName","value":"Mike"}]}
这只是stepanian答案的一个例子,但我更喜欢dumitru实现CustomSerializer的方法
public class InputField {
private String name;
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static List<InputField> parseInputFields(Object model) {
List<InputField> inputFields = new ArrayList<InputField>();
Field[] field = model.getClass().getDeclaredFields();
try {
for (int j = 0; j < field.length; j++) {
InputField inputField = new InputField();
inputField.setName(field[j].getName());
inputField.setValue(String.valueOf(field[j].get(model));
inputFields.add(inputField);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return inputFields;
}
公共静态列表parseInputFields(对象模型){
List inputFields=new ArrayList();
Field[]Field=model.getClass().getDeclaredFields();
试一试{
对于(int j=0;j
public static void main(String[] args) throws JsonProcessingException {
User user = new User(1L, "Mike");
Map<String, Object> tmpMap=new HashedMap();
tmpMap.put("inputFields", parseInputFields(user));
ObjectMapper om = new ObjectMapper();
System.out.println(om.writeValueAsString(tmpMap));
}
publicstaticvoidmain(字符串[]args)抛出JsonProcessingException{
用户=新用户(1L,“麦克”);
Map tmpMap=newhashedmap();
tmpMap.put(“inputFields”,parseInputFields(用户));
ObjectMapper om=新的ObjectMapper();
System.out.println(om.writeValueAsString(tmpMap));
}
您需要自定义序列化程序来序列化类
用户
对象的数组。这就是您需要做的:为什么需要这样一个笨拙的JSON结构?使用“id”:“123”,“name”:“George”不是更好吗
?您可能想看看这个线程-@BadCash,总是有原因的。在这种情况下,我试图与外部Web服务集成,它需要这样的结构。并将字段设置为InputFields类内的集合。或者创建自定义转换器。@stepanian实际上,InputFields不是一个大问题,问题是是name-value-pairs的结构吗?我理解。InputFields类将具有该结构。您使用的是什么版本的jackson?在示例中,我使用jackson 2.6.1将field.setAccessible(true);
添加到循环中,我将接受这个答案,因为它是最“正确的”确实,为了防止使用反射的可访问性,应该设置该标志。谢谢