首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当内部JSON对象条件为空时,使用Jackson将json对象映射到Java

当内部JSON对象条件为空时,使用Jackson将json对象映射到Java
EN

Stack Overflow用户
提问于 2019-03-07 00:18:28
回答 1查看 915关注 0票数 0

我正在为一个musixmatch.com公开的API实现一个REST客户端(它根据一些部分搜索歌词,例如:歌曲名称、艺术家等等)。(REST/JSON的新手总数)。

我的客户代码:

代码语言:javascript
复制
import java.io.IOException;
import java.io.InputStream;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.MappingJsonFactory;

import in.soumav.musixmatch.beans.MMResponse;

public class MusixMatchClient {

    public static void main(String[] args) throws JsonParseException, IOException {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("https://api.musixmatch.com").path("ws").path("1.1")
                                        .path("matcher.lyrics.get")
                                        .queryParam("q_track", "Wake Me Up")
                                        .queryParam("q_artist", "Greenday")
                                        .queryParam("apikey", "...my key...");
        Builder builderRequest = target.request();
        Response response = builderRequest.get();
        if (Response.Status.OK.getStatusCode() == response.getStatus()) {
           MappingJsonFactory factory = new MappingJsonFactory();
           JsonParser parser = factory.createJsonParser((InputStream) response.getEntity());
           MMResponse resp = parser.readValueAs(MMResponse.class);
           System.out.println(resp.getMessage().getBody().getLyrics().getLyrics_body());
       }

    }
}

当找到匹配时,JSON解析器将分析得很好。

当找到匹配时,API的响应(在POSTMAN中):

代码语言:javascript
复制
{
    "message": {
        "header": {
            "status_code": 200,
            "execute_time": 0.076157093048096
        },
        "body": {
            "lyrics": {
                "lyrics_id": 14080789,
                "explicit": 0,
                "lyrics_body": "Summer has come and passed\nThe innocent can never last\nWake me up when September ends\n\nLike my father's come to pass\nSeven years has gone so fast\nWake me up when September ends\n\nHere comes the rain again\nFalling from the stars\nDrenched in my pain again\nBecoming who we are\n\nAs my memory rests\nBut never forgets what I lost\n...\n\n******* This Lyrics is NOT for Commercial use *******",
                "script_tracking_url": "https://tracking.musixmatch.com/t1.0/m_js/e_1/sn_0/l_14080789/su_0/rs_0/tr_3vUCADW8Npey61GB2HRIObKY4Sz3low2ucLdqisdi7cAswHSwWeSM5uhan_JCxhFMVX0wKQjr_6eciPf6twsVnnD4RPIGl8wpzGhgPLQRIkUkBP0Zga626PhvTK603MycNGrL9kMxuLM8iA8b8IYiLDV_WzIffNXs2ENvhz39AuqdldwE0H-mS51SpVUU21V--VBwXN1uBD3ra2GANeMeuvOMMP4-8sa1tE3FvaEVUaP-mqxgQtDJHG2_aY01nRNfzLPZ86xPscgeQMrPiILn5lpC7mkagXpQDqXo0MpoTnHZPFKqhrgiVNxkpZzX-oqam8DZflIgIe4zMtg2Y3QE8MvjE5vp500IZUOz-Q0GhVKfND5T6Yv3-jOuvkRkSxYbI8tJmRhbVe5XX3DATCdqAB7zYHrwyijL90yRJJzv2f-SC4E6f0J/",
                "pixel_tracking_url": "https://tracking.musixmatch.com/t1.0/m_img/e_1/sn_0/l_14080789/su_0/rs_0/tr_3vUCAIcjYkNNhw02X2Dtvu6SSWbscstTuW8YKvMwxRjtwZRmYXk4v0xsOdvjifHmsY2VY5yQTLHPUONXovxMI4XXZKXkC4KwjUwXR1afVXX5JE010OvQ-IsmsFkZ7-wXEXWJEFH5WJoKALES1HdQPDGsDNy6J5mGQURtG9MsQTSnfRnNz6zJkWTLZZ2F1GnG9f7ncW8guku-lOOWYAPcs8--4U4A3uR47_hn6PBh-JvHaQ2lFUjD6L0JuKs_Bgx0nU6RN97H02EkD6xkYWtsjZytPEneUHf3IrikZMu-tWvoclj0imoww8c_8NlqvHXG8pHYFO4YLPwk5kqfRXlW2TtwmJ9u1Do048_UFyCLAIctEEZBJEfcwjSep7VwU3BOiaKhL2Cwe-xV-NdW5pSzAbRb8bZ5PRrUnD7P-7SzdDSbossTyt6O/",
                "lyrics_copyright": "Lyrics powered by www.musixmatch.com. This Lyrics is NOT for Commercial use and only 30% of the lyrics are returned.",
                "updated_time": "2016-02-06T23:07:22Z"
            }
        }
    }
}

但是,当没有找到匹配时,将返回以下响应(同时通过POSTMAN进行测试):

代码语言:javascript
复制
{"message":{"header":{"status_code":404,"execute_time":0.11416816711426},"body":[]}}

但是,邮递员中的实际状态代码返回200 OK!由于主体等于空数组,JSON解析器无法解析它并抛出以下异常:

线程"main“org.codehaus.jackson.map.JsonMappingException:中的异常不能在in.soumav.musixmatch.beans.Message["body"]">Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@d9345cd; line: 1, column: 74上反序列化START_ARRAY令牌中的in.soumav.musixmatch.beans.Body实例

我的对象映射如下:

MMResponse | Message \_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ | | Header(status\_cd, Body execution\_time) | | Lyrics(lyrics\_id,lyrics\_body etc.)

问题:

  1. 实现这一目标的更好方式/方法是什么?
  2. 如果我必须修改我现有的代码,我将如何处理它?
  3. 在将status_code映射到Java之前,如何在头( JSON响应中)读取它?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-07 00:35:13

您从API收到的状态代码似乎与响应对象中的状态代码不匹配。因为此响应不应满足if条件Response.Status.OK.getStatusCode() == response.getStatus()

代码语言:javascript
复制
{"message":{"header":{"status_code":404,"execute_time":0.11416816711426},"body":[]}}

如果API是错误的,并且您想绕过它,则需要从JSON响应中检查status_code。我建议如下:

代码语言:javascript
复制
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.IOUtils;

...

if (Response.Status.OK.getStatusCode() == response.getStatus()) {
  ObjectMapper mapper = new ObjectMapper();
  // Validate object status status_code or message.header.status_code
  String jsonString = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());

  JsonNode jsonObject = mapper.readTree(jsonString);
  String statusCode =
          jsonObject.get("message")
                  .get("header")
                  .get("status_code")
                  .toString();

  if(statusCode.equalsIgnoreCase("200")) {
    MappingJsonFactory factory = new MappingJsonFactory();
    JsonParser parser = factory.createJsonParser((InputStream) response.getEntity());
    MMResponse resp = parser.readValueAs(MMResponse.class);
    System.out.println(resp.getMessage().getBody().getLyrics().getLyrics_body());  
  }
}

上面的实现使用Jackson和commons。在下一个依赖项中可以找到IOUtils:

代码语言:javascript
复制
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.2</version>
</dependency>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55034209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档