如何在spring boot中重命名json对象(变量)名称

Posted

技术标签:

【中文标题】如何在spring boot中重命名json对象(变量)名称【英文标题】:How to rename json objects(variables) name in spring boot 【发布时间】:2016-12-02 19:01:55 【问题描述】:

您好,我是 Spring Boot 和 JSON 的新手,需要帮助重命名响应的变量名。

将此视为输入

   "1":    
      "id": "1",
      "firstName": "Cdgdghirayu",
      "lastName": "Sinfsdgdgghvi",
      "age": 23
   

现在我需要这种格式

   "1":    
      "Roll number": "1",
      "firstName": "Cdgdghirayu",
      "lastName": "Sinfsdgdgghvi",
      "age": 23
   

我们能以某种方式将"id" 映射到"roll number" 吗? 如何在 spring-boot 中实现这一点?

提前致谢

更新- 这是我的模型课

package model;

import javax.xml.bind.annotation.XmlRootElement;
import com.fasterxml.jackson.annotation.JsonProperty;

@XmlRootElement
public class Person 
@JsonProperty("Roll Number")
private String id;

private String firstName;
private String lastName;
private int age;

public Person() 
    super();


public Person(String id, String firstName, String lastName, int age) 
    super();
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;


public String getId() 
    return id;


public void setId(String id) 
    this.id = id;


public String getFirstName() 
    return firstName;


public void setFirstName(String firstName) 
    this.firstName = firstName;


public String getLastName() 
    return lastName;


public void setLastName(String lastName) 
    this.lastName = lastName;


public int getAge() 
    return age;


public void setAge(int age) 
    this.age = age;


这是我的服务类 在 addPerson() 函数中,我必须将 id 设置为将 id 设为 null ..

package service;

import java.util.Hashtable;
import org.springframework.stereotype.Service;
import model.Person;

@Service
public class PersonService 
    Hashtable<String,Person> persons=new Hashtable<String,Person>();
    public PersonService()
    Person p=new Person();
    p.setId("1");
    p.setFirstName("Chirayu");
    p.setLastName("Singhvi");
    p.setAge(23);
    persons.put("1",p);

    p=new Person();
    p.setId("2");
    p.setFirstName("Himanshu");
    p.setLastName("Singhvi");  
    p.setAge(20);
    persons.put("2",p);
    

    public Person getPerson(String id)
    if(persons.containsKey(id))
    return persons.get(id);
    else return null;
    

    public Hashtable<String,Person> getAll()
    return persons;
    

    public Person addPerson(Person person)
    persons.put(person.getId(),person);

    return person;


    public Person updatePerson(Person person)
    if(person.getId().equals("0"))
    return null;
    
    persons.put(person.getId(),person);
    return person;


    public Person removePerson(String id) 
    return persons.remove(id);
    

我的控制器类

package controller;

import java.util.Hashtable;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import model.Person;
import service.PersonService;

@RestController
@RequestMapping("/persons")
public class PersonController 
    static final Logger log = Logger.getLogger(PersonController.class.getName());

    PersonController()
    log.info("entering controller class");
    

    @Autowired
    PersonService personService;

    @RequestMapping("/all")
    public Hashtable<String,Person> getAll()
    log.info("getting all  person details");
    System.out.println("syso is working");
    return personService.getAll();
    

    @RequestMapping(value="/all",method=RequestMethod.POST,
            produces=MediaType.APPLICATION_JSON_VALUE,
            consumes=MediaType.APPLICATION_JSON_VALUE )
    @ResponseBody
    public Person addPerson(@RequestBody Person person)
    log.info("Adding person with id "+person.getId());
    person.getId();
    return personService.addPerson(person);
    

    @RequestMapping(value="/id",method=RequestMethod.PUT,
            produces=MediaType.APPLICATION_JSON_VALUE,
            consumes=MediaType.APPLICATION_JSON_VALUE )
    @ResponseBody
    public Person updatePerson(@PathVariable("id") String id, 
            @RequestBody Person person)
    person.setId(id);

    log.info("Updating a partcular person details  with id "+id);
    return personService.updatePerson(person);
    

    @RequestMapping(value="/id",method=RequestMethod.DELETE)
    public void removePerson(@PathVariable("id") String id)
     log.info("Removing the person details with id "+id);
     personService.removePerson(id);
    

    @RequestMapping("/id")
    public Person getPerson(@PathVariable("id") String id)
    log.info("getting person details with id "+id);
    return personService.getPerson(id);
    

    public void setDthDao(PersonService dao) //for testing purpose
    personService=dao;
    

现在在 SOAPUI 测试中(将文本写入快照不上传)

对于 GET 请求:endpoint-http://localhost:8080:Resource-/persons/all

响应-


   "2": 
      "firstName": "Himanshu",
      "lastName": "Singhvi",
      "age": 20,
      "Roll Number": "2"
   ,
   "1": 
      "firstName": "Chirayu",
      "lastName": "Singhvi",
      "age": 23,
      "Roll Number": "1"
   

现在为 Post-:endpoint-http://localhost:8080:Resource-/persons/all

媒体类型-


  "firstName": "Rahul",
  "lastName": "Jain",
  "age": 23,
  "id": "6"

回复我收到的内容


   "timestamp": 1469790685110,
   "status": 500,
   "error": "Internal Server Error",
   "exception": "java.lang.NullPointerException",
   "message": "No message available",
   "path": "/persons/all"

我想要的回应


   "firstName": "Rahul",
   "lastName": "Jain",
   "age": 23,
   "Roll number": "6"

【问题讨论】:

【参考方案1】:

假设您有一个用于 id 属性的 getter 方法,您可以尝试将 com.fasterxml.jackson.core 依赖项添加到您的项目并像这样注释您的方法:

@JsonProperty("Roll Number")
public Long getId () 
    return id;

【讨论】:

现在出现了一个问题,因为我正在使用 @jsonProperty ,当我以 "firstName": "Chfirayu", "lastName": "Singghhvi", "age": 23, " 进行发布请求时id": "6" 它给出了 null ponter 异常,有没有办法以原始格式写帖子,或者我必须使用卷号而不是 id? 我不知道您实现的完整上下文,所以我不知道您如何处理发布请求。您能否在问题中发布您的实现 sn-p。 对,您可以尝试将 @JsonProperty 放在 getter 上,而不是在您声明 id 时再试一次。 试过..不工作..如果我们在正文中发送“卷号”而不是“id”,它将起作用...... 问题已解决...这是@JsonProperty("Roll Number") private String id; @JsonProperty("Roll Number") public String getId() return id; @JsonProperty("id") public void setId(String id) this.id = id; 【参考方案2】:

终于搞定了 刚刚在我的模型类中进行了以下更改。

@JsonProperty("Roll Number")
private String id;

@JsonProperty("Roll Number")
public String getId() 
    return id;


@JsonProperty("id")
public void setId(String id) 
    this.id = id;

【讨论】:

以上是关于如何在spring boot中重命名json对象(变量)名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nest.js 中重命名 JSON 字段

如何在JSON中重命名密钥

Spring Responsebody,json中的命名列表对象

使用 Jpa 和 Thymeleaf 在 Spring Boot 中重定向页面

如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行

如何使用spring boot将json映射到对象[重复]