Java:JsonPareser不包含任何数据 [英] Java : JsonPareser contains no data

查看:215
本文介绍了Java:JsonPareser不包含任何数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究一个Java应用程序,其中我试图从基于Spring-MVC的服务器获取数据,目前是system.out,但由于标记为空,因此我得到了输出。我打印出正在从服务器发送的代码,这是正确的。我没有那么多的REST经验,所以如果有人告诉我我做错了什么,我将不胜感激。

客户端代码:

  public void getCanvas(){
JsonFactory jsonFactory = new JsonFactory();
String canvas =;
尝试{
JsonParser jsonParser = jsonFactory.createJsonParser(new URL(canvasURL));
JsonToken token = jsonParser.nextToken();
while(token!= JsonToken.START_ARRAY){
token = jsonParser.nextToken();
System.out.println(Token is+ token);
}
while(token!= JsonToken.END_ARRAY){
token = jsonParser.nextToken();
if(token == JsonToken.START_OBJECT){
canvas = jsonParser.toString();
//我也尝试过token.toString
System.out.println(Canvas is+ canvas);



$ catch(IOException e){
e.printStackTrace();



$ b $ / code $ / pre
$ b $ 输出:

 令牌为FIELD_NAME 
令牌为VALUE_NUMBER_INT
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_NUMBER_FLOAT
令牌为FIELD_NAME
令牌为VALUE_NULL
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_NULL
令牌为FIELD_NAME
令牌为VALUE_FALSE
令牌为FIELD_NAME
令牌为VALUE_NULL
令牌为FIELD_NAME
令牌为VALUE_NUMBER_INT
令牌为END_OBJECT

必须打印至少100次。



服务器代码:

  @RequestMapping(value =/ getcanvas ,method = RequestMethod.GET)
public @ResponseBody String getCanvasforFX(){
System.out.println(Canvas was requested);
Canvas canvas = this.canvasService.getCanvasById(10650);

ObjectMapper objectMapper = new ObjectMapper();
尝试{
System.out.println(Canvas value is+ objectMapper.writeValueAsString(canvas));
返回objectMapper.writeValueAsString(canvas);
} catch(IOException e){
e.printStackTrace();
返回null;


服务器输出:

 要求画布
画布值为{canvasid:10650,canvasname:Aks,画布编号:1.0,canvastitle :NULL, canvasdate: , canvascreator: , canvasiteration: , canvasimage: iVBORw0K5CYII =, canvasDisabled:假 的imageData:NULL, person1id:7402 }

我在做什么错误,我想在客户端打印这个画布值。

解决方案

那么, JsonToken.nextToken()的JsonParser API文档说得非常好主要迭代方法,它将推进足够的流以确定下一个标记的类型(如果有的话)。如果没有其他内容(流在结束之前没有可能的空白空间以外的内容),则返回

换句话说,如果没有剩余的标记,nextToken()将返回null。相应地,因为 while 语句总是评估为 true ,所以它会在无限循环中继续打印标记为null

b
$ b

我应该提及的另一点是,如果您需要标记 ,而不是 JsonToken.type ,你应该改变

  System.out.println(Token is+ token); 

  System.out.println(Token is+ jsonParser.getText()); 

否则,代码将显示以下内容:

 令牌为FIELD_NAME 
令牌为VALUE_NUMBER_INT
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_NUMBER_FLOAT
令牌为FIELD_NAME
令牌为VALUE_NULL
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_STRING
令牌为FIELD_NAME
令牌为VALUE_FALSE
令牌为FIELD_NAME
令牌为VALUE_NULL
令牌为FIELD_NAME
令牌为VALUE_NUMBER_INT
令牌为END_OBJECT

因此,你的代码应该修改如下:

  public void getCanvas(){
JsonFactory jsonFactory = new JsonFactory();
String canvas =;
尝试{
JsonParser jsonParser = jsonFactory.createJsonParser(new URL(canvasURL));
JsonToken token = jsonParser.nextToken(); (令牌!= JsonToken.START_ARRAY&& token =空){
token = jsonParser.nextToken();

//如果我们已经通过了最后一个令牌
// break,不要将其不必打印出来
if(token == null)break;

System.out.println(Token is+ token);
}
while(token!= JsonToken.END_ARRAY){
token = jsonParser.nextToken();
if(token == JsonToken.START_OBJECT){
canvas = jsonParser.toString();
//我也尝试过token.toString
System.out.println(Canvas is+ canvas);



$ catch(IOException e){
e.printStackTrace();
}
}

产生以下输出:

 令牌为画布
令牌为10650
令牌为画布名称
令牌为Aks
令牌为画布号
令牌为1.0
令牌为canvastitle
令牌为空
令牌为canvasdate
令牌为
令牌为canvascreator
令牌为
令牌是画布
令牌是
令牌是canvasimage
令牌是iVBORw0K5CYII =
令牌是canvasDisabled
令牌是false
令牌是imageData
令牌为空
令牌为person1id
令牌为7402
令牌为}



祝你好运!


I am working on a Java application in which I am trying to get data from a Spring-MVC based server and currently system.out it, but I am getting ouput as token is null. I printed out the code which is being sent from the server, it is correct. I don't have that much experience with REST, so I would appreciate if someone tells me what I am doing wrong.

Client code :

 public void getCanvas(){
           JsonFactory jsonFactory = new JsonFactory();
            String canvas = "";
            try {
                JsonParser jsonParser = jsonFactory.createJsonParser(new URL(canvasURL));
                JsonToken token = jsonParser.nextToken();
                while (token!=JsonToken.START_ARRAY){
                    token = jsonParser.nextToken();
                    System.out.println("Token is "+token);
                }
                while (token != JsonToken.END_ARRAY){
                    token = jsonParser.nextToken();
                    if(token == JsonToken.START_OBJECT){
                       canvas  = jsonParser.toString();
    // I also tried token.toString
                        System.out.println("Canvas is "+canvas);
                    }

                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

CLient output :

  Token is FIELD_NAME
Token is VALUE_NUMBER_INT
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_NUMBER_FLOAT
Token is FIELD_NAME
Token is VALUE_NULL
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_NULL
Token is FIELD_NAME
Token is VALUE_FALSE
Token is FIELD_NAME
Token is VALUE_NULL
Token is FIELD_NAME
Token is VALUE_NUMBER_INT
Token is END_OBJECT

That must have been printed atleast 100 times.

Server code :

  @RequestMapping(value = "/getcanvas",method = RequestMethod.GET)
    public @ResponseBody String getCanvasforFX(){
        System.out.println("Canvas was requested");
        Canvas canvas = this.canvasService.getCanvasById(10650);

        ObjectMapper objectMapper = new ObjectMapper();
        try {
            System.out.println("Canvas value is "+objectMapper.writeValueAsString(canvas));
            return objectMapper.writeValueAsString(canvas);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

Server output:

Canvas was requested
Canvas value is {"canvasid":10650,"canvasname":"Aks","canvasnumber":1.0,"canvastitle":null,"canvasdate":"","canvascreator":"","canvasiteration":"","canvasimage":"iVBORw0K5CYII=","canvasDisabled":false,"imageData":null,"person1id":7402}

What am I doing wrong, I want to print this canvas Value in the client-side.

解决方案

Well, the JsonParser API docs for JsonToken.nextToken() says it very well (emphasis mine):

Main iteration method, which will advance stream enough to determine type of the next token, if any. If none remaining (stream has no content other than possible white space before ending), null will be returned.

In other words, if there are no remaining tokens, nextToken() will return null. Accordingly, because your while statement always evaluates to true, it will keep on printing token is null in an endless loop.

Another point I should mention is that if you want the token value rather than the JsonToken.type, you should change

System.out.println("Token is "+ token);

to

System.out.println("Token is "+ jsonParser.getText());

otherwise, the code will print the following:

Token is FIELD_NAME
Token is VALUE_NUMBER_INT
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_NUMBER_FLOAT
Token is FIELD_NAME
Token is VALUE_NULL
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_STRING
Token is FIELD_NAME
Token is VALUE_FALSE
Token is FIELD_NAME
Token is VALUE_NULL
Token is FIELD_NAME
Token is VALUE_NUMBER_INT
Token is END_OBJECT

Therefore, your code should be modified as follows:

 public void getCanvas(){
       JsonFactory jsonFactory = new JsonFactory();
        String canvas = "";
        try {
            JsonParser jsonParser = jsonFactory.createJsonParser(new URL(canvasURL));
            JsonToken token = jsonParser.nextToken();
            while (token!=JsonToken.START_ARRAY && token != null){
                token = jsonParser.nextToken();

                // if we already passed last token,
                // break, don't print it out unnecessarily
                if (token == null) break;

                System.out.println("Token is "+ token);
            }
            while (token != JsonToken.END_ARRAY){
                token = jsonParser.nextToken();
                if(token == JsonToken.START_OBJECT){
                   canvas  = jsonParser.toString();
// I also tried token.toString
                    System.out.println("Canvas is "+canvas);
                }

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

which yields the following output:

Token is canvasid
Token is 10650
Token is canvasname
Token is Aks
Token is canvasnumber
Token is 1.0
Token is canvastitle
Token is null
Token is canvasdate
Token is 
Token is canvascreator
Token is 
Token is canvasiteration
Token is 
Token is canvasimage
Token is iVBORw0K5CYII=
Token is canvasDisabled
Token is false
Token is imageData
Token is null
Token is person1id
Token is 7402
Token is }

Good luck to you!

这篇关于Java:JsonPareser不包含任何数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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