Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用特定语法将Java对象转换为JSON_Java_Json_Serialization - Fatal编程技术网

使用特定语法将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

我想将Java对象转换为JSON字符串。假设对象看起来像这样:

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的方法

  • 创建一个InputField类

    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);
    添加到循环中,我将接受这个答案,因为它是最“正确的”确实,为了防止使用反射的可访问性,应该设置该标志。谢谢