【问题标题】:How to create dynamically acceptable JSON in RESTful web services?如何在 RESTful Web 服务中创建动态可接受的 JSON?
【发布时间】:2017-09-02 22:13:22
【问题描述】:

以下是我的 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 元素的更好方法是什么?

【问题讨论】:

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


    【解决方案1】:

    在我看来,当您不知道 JSON 的最终结构时,使用 Spring 在 Java 中处理 JSON 的最简单和最高效的方法是使用 Map(s)。

    你可以在你的 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 处理它时得到的:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      相关资源
      最近更新 更多