【问题标题】:Fetching Json from firebase as string not working in java从firebase获取Json作为字符串在java中不起作用
【发布时间】:2016-08-23 23:12:01
【问题描述】:

使用休息的 Firebase 数据:

控制台中的 FireBase 数据: 从 firebase 获取数据的 Java 代码

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(100);
        cm.setDefaultMaxPerRoute(100);
        httpClient =  HttpClients.custom()
        .setConnectionManager(cm)               
        .build();
        CloseableHttpResponse response;
        try {
            String url = "https://testcustom-a1a4d.firebaseio.com/1719126/1719130/1719121.json?auth=myauthId";
            HttpGet httpGet = new HttpGet(url);         
            response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            SolutionDto solutionDto = objectMapper.readValue(entity.getContent(), SolutionDto.class);
            System.out.println(solutionDto);

        } catch (IOException e) {
            log.error("something went wrong while processing requrest to fireBase", e);         
        }

java 中的错误:

    com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.web.dtos.SolutionDto] from String value ('{"testId":"1719126"}'); no single-String constructor/factory method
 at [Source: org.apache.http.conn.EofSensorInputStream@554083; line: 1, column: 1]
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:757) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:277) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:289) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1133) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:135) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.module.afterburner.deser.SuperSonicBeanDeserializer.deserialize(SuperSonicBeanDeserializer.java:123) ~[jackson-module-afterburner-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051) ~[jackson-databind-2.4.3.jar:2.4.3]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2192) ~[jackson-databind-2.4.3.jar:2.4.3]

为什么无法将字符串解析为对象?

编辑: 解决方案Dto.java

@JsonInclude(Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown=true)
public class SolutionDto {
    private Long testId;
    public SolutionDto(){}
    public SolutionDto(Long testId) {
       this.testId = testId;
    }
    public void setTestId(Long testId) {
        this.testId = testId;
    }
    public Long getTestId() {
        return testId;
    }
}

从 firebase 导出 Json:

{
  "1719126" : {
    "1719130" : {
      "1719121" : "{\"testId\":\"1719126\"}"
    }
  }
}

下面的代码在上面的 solutionDto 上可以正常工作,但是当使用 apache 从 firebase 获取相同的代码时它不起作用

String s = "{\"testId\":\"1719126\"}";
objectMapper.readValue(s, SolutionDto.class);

【问题讨论】:

  • 除了 Jordi 的回答,没有看到SolutionDto,我们无话可说。另请注意,您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,使我们能够轻松地使用它来测试您的实际数据,在我们的答案中使用它,而且通常只是一件好事。
  • @FrankvanPuffelen 添加了缺失的细节

标签: java json jackson firebase-realtime-database apache-httpclient-4.x


【解决方案1】:

正如你的例外所说...... 没有单字符串构造函数/工厂方法

您需要提供一个单字符串构造函数,即:

public SolutionDto(String data)

或者按照here的描述创建一个@JsonCreator注解的工厂

【讨论】:

  • 请求查看编辑部分...在我看来,异常中打印的 json 也可以...from String value ('{"testId":"1719126"}'); no single-Str...
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多