簡體   English   中英

傑克遜無法解析json,返回NPE

[英]Jackson can't parse json, returns NPE

我正在嘗試解析看起來像的json(steam webchat)(我更改了響應,因為我不想顯示數據):

/**/({
"pollid": 00,
"messages": [
    {
        "type": "personastate",
        "timestamp": 0000000000,
        "utc_timestamp": 000000000,
        "steamid_from": "000000000000",
        "status_flags": 0000000,
        "persona_state": 0,
        "persona_name": "asd"
    }
]
,
"messagelast": 00,
"timestamp": 0000000000,
"utc_timestamp": 000000000000,
"messagebase": 00,
"sectimeout": 0,
"error": "OK"
})

我的解析類如下所示:

package jsonRequest;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public class NewMessageJson {

public Integer poollid;
private String lastMessageId;
private String error;
private String messageBase;

public NewMessageJson(String response) {
response = response.substring(response.indexOf("{"),
    response.indexOf("}") + 1); // cut off comment block


JsonFactory factory = new JsonFactory();
JsonParser jp = null;
try {
    jp = factory.createJsonParser(response);
} catch (JsonParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
try {

    if (jp.nextToken() != JsonToken.START_OBJECT) {
    throw new IOException("Server didn't return any data");
    }

    while (jp.nextToken() != JsonToken.END_OBJECT) {
    String fieldName = jp.getCurrentName();
    jp.nextToken();
    if (fieldName.equals("messagelast")) {
        setLastMessageId(jp.getText());
    } else if (fieldName.equals("pollid")) {
        setPoollid(jp.getIntValue());
    } else if (fieldName.equals("messagebase")) {
        setMessageBase(jp.getText());
    } else if (fieldName.equals("error")) {
        setError(jp.getText());
    }
    }
    jp.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (NullPointerException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

try {
    jp.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
}

public Integer getPoollid() {
return poollid;
}

public void setPoollid(Integer poollid) {
this.poollid = poollid;
}

public String getLastMessageId() {
return lastMessageId;
}

public void setLastMessageId(String lastMessageId) {
this.lastMessageId = lastMessageId;
}

public String getError() {
return error;
}

public void setError(String error) {
this.error = error;
}

public String getMessageBase() {
return messageBase;
}

public void setMessageBase(String messageBase) {
this.messageBase = messageBase;
}

}

當談到生產線時

if (fieldName.equals("messagelast")) {

它崩潰並返回NPE。 我還有其他三門課,看起來完全像這樣一門課,並且一切正常。

我很確定獲得NPE的原因是因為您最初將JsonParser jp實例JsonParser jp null 您可以在try塊中將其分配給factory.createJsonParser(response) ,但除了打印堆棧跟蹤信息外,不以任何其他方式處理錯誤。 如果執行factory.createJsonParser(response)出錯,則需要確保沒有其他任何運行。

我建議將您的代碼更改為此:

...

JsonFactory factory = new JsonFactory();
JsonParser jp = null;
try {
    jp = factory.createJsonParser(response);
} catch (JsonParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    System.out.println("There was an error while setting jp to factory.createJsonParser(response). Error message is: " + e1.getMessage());
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    System.out.println("There was an error while setting jp to factory.createJsonParser(response). Error message is: " + e1.getMessage());
}

if(jp != null) {
try {

    if (jp.nextToken() != JsonToken.START_OBJECT) {
    throw new IOException("Server didn't return any data");
    }

    while (jp.nextToken() != JsonToken.END_OBJECT) {
    String fieldName = jp.getCurrentName();
    jp.nextToken();
    if (fieldName.equals("messagelast")) {
        setLastMessageId(jp.getText());
    } else if (fieldName.equals("pollid")) {
        setPoollid(jp.getIntValue());
    } else if (fieldName.equals("messagebase")) {
        setMessageBase(jp.getText());
    } else if (fieldName.equals("error")) {
        setError(jp.getText());
    }
    }
    jp.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (NullPointerException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

try {
    jp.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
}
}

...

這樣,您可以避免所有NPE!

編輯:您還應該實現peeskillet建議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM