如何在RESTful Web服务中创建动态可接受的JSON?

时间:2017-09-02 22:13:22

标签: json rest web-services spring-boot spring-restcontroller

以下是我的JSON文件:

Input JSON:
{
 "name": "Tamiliniyan",
 "address": {
    "street": "My street",
    "city": "Texas"
 }
}

Controller class:
@RestController
@RequestMapping(value = "/customer")
public class CustomerController {

  @Autowired
  private WelcomeService customerService;

  @RequestMapping(method = RequestMethod.POST)
  public void addCustomer(@RequestBody Customer customer) {
     return customerService.addTranslation(customer);
  }
}

POJO:
public class Customer
{
  private Address address;
  private String name;
  public Address getAddress ()
  {
     return address;
  }

  public void setAddress (Address address)
  {
     this.address = address;
  }

  public String getName ()
  {
  return name;
  }

  public void setName (String name)
  {
     this.name = name;
  }
}

public class Address
{
private String street;

private String city;

public String getStreet ()
{
    return street;
}

public void setStreet (String street)
{
    this.street = street;
}

public String getCity ()
{
  return city;
}

public void setCity (String city)
{
  this.city = city;
}
}

现在我必须动态添加城市或邮政编码。怎么做?基本上,客户端系统可以传递具有当前结构的任何新的附加JSON字段(如城市或邮政编码)。 CustomerController类应该能够解析它。在restful服务中处理动态JSON元素的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

在我看来,当你不了解JSON的最终结构时,使用Spring在Java中处理JSON的最简单,最高效的方法就是使用Map。

您可以在POJO中添加以下内容:

public class Customer {
    private Address address;
    private String name;
    private Map<String, ?> additionalFields;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Map<String, ?> getAdditionalFields() {
        return additionalFields;
    }

    public void setAdditionalFields(Map<String, ?> additionalFields) {
        this.additionalFields = additionalFields;
    }
}

如果您发布这样的内容:

{
 "name": "Tamiliniyan",
 "address": {
    "street": "My street",
    "city": "Texas"
 },
 "additionalFields": {
    "nested1":{
        "zip-code": "00055"
    }
 }
}

这是Spring处理它时所得到的:

Map Result

为了检索数据,您可以使用以下方法:

customer.getAdditionalFields().containsKey("nested1")
customer.getAdditionalFields().get("nested1")

另一种方法是将您需要的任何字段添加到类中,然后忽略Jackson配置中的空字段