Jersey 客户端解组 JSON 包含根元素错误

Jersey client unmarshall JSON include root element error

我正在连接到我无法控制的远程服务器。 发回的 JSON 包含一个根元素。

{"company":{"name":"Personal"}}

尝试将字符串解组为公司对象时出现以下错误:org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "company"

以下是我在测试中的配置class。我正在使用 JUnit 4.12、Jersey-client 1.19 和 Jersey-json 1.19

@XmlRootElement
public class Company{

    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Company{" + "name=" + name + '}';
    }
}

测试客户端:

public class CompanyResourceTest {

    @Test
    public void createClient() {    

        ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getClasses().add(JacksonJsonProvider.class);
        Client client = Client.create(clientConfig);


        WebResource webResource = client.resource("http://localhost:8686/voucher-test/rest/company");

        String companyName = "Personal";
        ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, companyName );
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus() + ", " + response.getStatusInfo());
        }

        Company json = response.getEntity(Company.class);
    }
}

如何解组 JSON 字符串?

创建一个将 Company 对象作为 属性 的包装器 class。例如,

@XmlRootElement
public class CompanyResponse{
  private String company;

  public String getCompany() {
    return company;
  }

  public void setCompany(String company) {
    this.company= company;
  }
}

然后,使用这个 class 从服务器获取响应。 即,更改以下内容

Company json = response.getEntity(Company.class);

Company json = response.getEntity(CompanyResponse.class).getCompany();

更新

正如@JuanDM 所建议的,在 @XmlRootElement 中包含 name 属性也有效: @XmlRootElement(name="company")

您的公司需要默认(空)构造函数class