2015-05-14 51 views
1

我正在一个Java应用程序中尝试从基于Spring-MVC的服务器获取数据,并且当前是system.out它,但由于标记为空而得到输出。我打印出正在从服务器发送的代码,这是正确的。我对REST没有太多经验,所以如果有人告诉我我做错了什么,我将不胜感激。Java:JsonPareser不包含任何数据

客户机代码:

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

    } 

客户机输出:

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 

即必须是已印刷ATLEAST 100倍。

Server代码:

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

服务器输出:

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} 

什么我做错了,我想打印在客户端受此画布价值。

回答

1

嗯,JsonToken.nextToken的JsonParser API文档()说,这非常好(重点煤矿):

主要迭代法,这将推进流足以确定下一个令牌的类型,如果有的话。如果没有剩余(流在结束之前没有除可能的空白之外的内容),空将被返回

换句话说,如果没有剩余的标记,nextToken()将返回null。因此,因为您的声明总是评估为true,它会继续打印令牌为空在无限循环中。

我要提到的另一点是,如果你想令牌而非JsonToken.type,你应该改变

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

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

否则,代码将打印以下内容:

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 

因此,您的代码应作如下修改:

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

这将产生以下输出:

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 } 

祝你好运!

+0

它终于奏效了。 –