从firebase中获取Json,因为字符串在java中不起作用 [英] Fetching Json from firebase as string not working in java

查看:1073
本文介绍了从firebase中获取Json,因为字符串在java中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用其他的Firebase数据:



控制台中的FireBase数据:

从firebase获取数据的Java代码

  PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager (); 
cm.setMaxTotal(100);
cm.setDefaultMaxPerRoute(100);
httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
CloseableHttpResponse响应;
试试{
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);
$ b $ catch(IOException e){
log.error(处理请求到fireBase时出错了,e);

java错误:

  com.fasterxml.jackson.databind.JsonMappingException:无法从字符串value('{testId)实例化类型为[simple type,com.web.dtos.SolutionDto的类的值1719126});没有单个字符串的构造函数/工厂方法
at [Source:org.apache.http.conn.EofSensorInputStream@554083;行:1,列:1]
在com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)〜[jackson-databind-2.4.3.jar:2.4.3]
在com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:757)〜[jackson-databind-2.4.3.jar:2.4.3]
在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]
在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]

为什么不能解析字符串如何对象?



编辑:
SolutionDto.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;




$ b

从firebase导出Json:

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

下面的代码可以和上面的solutionDto一起工作,但是当从firebase中使用apache获取时,它是行不通的

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


解决方案

没有单个字符串的构造函数/工厂方法



您需要提供一个单个字符串构造函数 b
$ b

  public SolutionDto(String data)

或按照 @JsonCreator 注释的工厂。 on-deserialize-requests-single-string-constr> here


Firebase data using rest:

FireBase data in console: Java code to fetch data from firebase

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);         
        }

Error in 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]

Why it is not able to parse string to object?

EDIT: SolutionDto.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;
    }
}

Export of Json from firebase:

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

The below code work fine with above solutionDto, but when the same is fetch using apache from firebase it does not work

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

解决方案

As your exception says.... no single-String constructor/factory method

You need to provide a single-String constructor i.e:

public SolutionDto(String data)

Or create a factory annotated by @JsonCreator as described here

这篇关于从firebase中获取Json,因为字符串在java中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆