【问题标题】:Consuming Rest Service消费休息服务
【发布时间】:2016-03-30 13:31:30
【问题描述】:

我刚开始使用休息服务,我已经阅读了这个https://spring.io/guides/gs/consuming-rest/。然后根据本教程,我有一项服务可以使用和显示。 该服务是一个休息 api,我得到一个这样的 json

 {
"disclaimer": "1",
"license": "2",
"timestamp": 1458057661,
"base": "someValue",
   "rates": {
     "one": 3.673019,
     "two": 68.449999,
   "three": 124.168,
  "four": 488.669996,
    ...,
     ...,
   ...
   }
}

然后我创建了 2 个这样的 Java 类

@JsonIgnoreProperties(ignoreUnknown = true)
public class Cur {

private String disclaimer;
private String license;
private String timestamp;
private String base;    
private Rates rates;

public Cur() {
    super();
}

///get/set 


///tostring

}

@JsonIgnoreProperties(ignoreUnknown = true)
 public class Rates {

public Rates(){

    //// i am not sure here how  should i get the rates value.
   }

 }

问题是我如何填充 Rates 类以将数据放入变量中,以便稍后我可以呈现 on view。 我使用 RestTemplate。这是测试。它有效,但我没有费率值。 我想我需要一张地图,因为它是一个集合。知道如何实现它。

@Test
public void getCurTest() { 
    String URL="some url";
    String JSONTYPE="some json type";
    String API="some id";
    RestTemplate restTemplate = new RestTemplate();         
    Cur cur= restTemplate.getForObject(URL+JSONTYPE+API, Cur.class);
    log.info("cur");        
    System.out.println(cur);
}

【问题讨论】:

  • 查看JSON中"rates"对象的内容。您可以使用哪种数据结构(想想内置的)来存储看起来像这样的数据集?
  • 这可能是一个类似键值的映射,但我不确定。
  • 如果你说rates 是一张地图会怎样?
  • 我也搜索并找到了这个wiki.fasterxml.com/JacksonInFiveMinutes
  • 一张地图会有像键“一”这样的费率值:值 3.673019 但不确定

标签: java spring rest


【解决方案1】:

几年前我也有过同样的情况,这有点奇怪。在这里你可以做什么。

第一个解决方案

简单的方法是

 CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpget = new HttpGet("your rest service api");
    CloseableHttpResponse response = httpclient.execute(httpget);
    try {
        HttpEntity entity = response.getEntity();

        if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
            String responseValue = EntityUtils.toString(entity);
            System.out.println(responseValue);
        } else {
            // log error
        }
    } finally {
        response.close();
    }
}

然后您可以将所有内容作为字符串获取,并使用正则表达式对其进行解析并获得您想要的内容。

第二个解决方案

您可以按原样将所有其余部分保存到数据库中。使用 mongodb 更快。
然后你可以把它从那里拿到一个类并使用它。

第三种解决方案

使用此工具http://www.jsonschema2pojo.org/ 只需粘贴您的 json,它将创建您的 java 类以使用它们。您可以选择任何您想要添加的内容。这将创建您的类,然后您可以使用它们。 这里是为了您的方便。

package com.example;

import java.util.HashMap;
import java.util.Map;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import org.apache.commons.lang.builder.ToStringBuilder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"disclaimer",
"license",
"timestamp",
"base",
"rates"
})
public class Example {

@JsonProperty("disclaimer")
private String disclaimer;
@JsonProperty("license")
private String license;
@JsonProperty("timestamp")
private Integer timestamp;
@JsonProperty("base")
private String base;
@JsonProperty("rates")
private Rates rates;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
* No args constructor for use in serialization
*
*/
public Example() {
}

/**
*
* @param timestamp
* @param disclaimer
* @param base
* @param rates
* @param license
*/
public Example(String disclaimer, String license, Integer timestamp, String base, Rates rates) {
this.disclaimer = disclaimer;
this.license = license;
this.timestamp = timestamp;
this.base = base;
this.rates = rates;
}

/**
*
* @return
* The disclaimer
*/
@JsonProperty("disclaimer")
public String getDisclaimer() {
return disclaimer;
}

/**
*
* @param disclaimer
* The disclaimer
*/
@JsonProperty("disclaimer")
public void setDisclaimer(String disclaimer) {
this.disclaimer = disclaimer;
}

/**
*
* @return
* The license
*/
@JsonProperty("license")
public String getLicense() {
return license;
}

/**
*
* @param license
* The license
*/
@JsonProperty("license")
public void setLicense(String license) {
this.license = license;
}

/**
*
* @return
* The timestamp
*/
@JsonProperty("timestamp")
public Integer getTimestamp() {
return timestamp;
}

/**
*
* @param timestamp
* The timestamp
*/
@JsonProperty("timestamp")
public void setTimestamp(Integer timestamp) {
this.timestamp = timestamp;
}

/**
*
* @return
* The base
*/
@JsonProperty("base")
public String getBase() {
return base;
}

/**
*
* @param base
* The base
*/
@JsonProperty("base")
public void setBase(String base) {
this.base = base;
}

/**
*
* @return
* The rates
*/
@JsonProperty("rates")
public Rates getRates() {
return rates;
}

/**
*
* @param rates
* The rates
*/
@JsonProperty("rates")
public void setRates(Rates rates) {
this.rates = rates;
}

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}


package com.example;

import java.util.HashMap;
import java.util.Map;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import org.apache.commons.lang.builder.ToStringBuilder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"one",
"two",
"three",
"four"
})
public class Rates {

@JsonProperty("one")
private Double one;
@JsonProperty("two")
private Double two;
@JsonProperty("three")
private Double three;
@JsonProperty("four")
private Double four;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
* No args constructor for use in serialization
*
*/
public Rates() {
}

/**
*
* @param two
* @param one
* @param three
* @param four
*/
public Rates(Double one, Double two, Double three, Double four) {
this.one = one;
this.two = two;
this.three = three;
this.four = four;
}

/**
*
* @return
* The one
*/
@JsonProperty("one")
public Double getOne() {
return one;
}

/**
*
* @param one
* The one
*/
@JsonProperty("one")
public void setOne(Double one) {
this.one = one;
}

/**
*
* @return
* The two
*/
@JsonProperty("two")
public Double getTwo() {
return two;
}

/**
*
* @param two
* The two
*/
@JsonProperty("two")
public void setTwo(Double two) {
this.two = two;
}

/**
*
* @return
* The three
*/
@JsonProperty("three")
public Double getThree() {
return three;
}

/**
*
* @param three
* The three
*/
@JsonProperty("three")
public void setThree(Double three) {
this.three = three;
}

/**
*
* @return
* The four
*/
@JsonProperty("four")
public Double getFour() {
return four;
}

/**
*
* @param four
* The four
*/
@JsonProperty("four")
public void setFour(Double four) {
this.four = four;
}

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

那么你就可以随意使用了。

我希望这一切都会有所帮助。保重。

【讨论】:

  • @GiorgoCh 我用过第一个,它可以工作。谢谢
  • 是的,但jsonschema2pojo.org 也可以满足您的需求。
【解决方案2】:

你的 JSON 是这样的,要让 Rates 填充你的类应该是这样的。

public class Cur {

    private String disclaimer;
    private String license;
    private Integer timestamp;
    private String base;
    private Rates rates;

}

public class Rates {

    private Double one;
    private Double two;
    private Double three;
    private Double four;
    //This would be better but the JSON dosnt fit this 
    //private Map<String, Double> rates;

}

您尝试使用哪个 API?

【讨论】:

  • @Johanes 已经尝试过这个 exaclty,因为你有它完全一样。但是我得到一个空地图。所以问题是如何获得可以从 1 到 1000 个变量的值。
  • 您使用的是哪个 API?
  • 一种用于货币的 API。我不能说是哪一个。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2021-11-14
  • 2019-05-25
  • 1970-01-01
相关资源
最近更新 更多