private void constructJson(JSONObject json) throws WeiboException {
        try {
            createdAt = parseDate(json.getString("created_at"), "EEE MMM dd HH:mm:ss z yyyy");
            id = json.getString("id");
            mid = json.getString("mid");
            idstr = json.getLong("idstr");
            text = json.getString("text");
            if (!json.getString("source").isEmpty()) {
                source = new Source(json.getString("source"));
            }
            inReplyToStatusId = getLong("in_reply_to_status_id", json);
            inReplyToUserId = getLong("in_reply_to_user_id", json);
            inReplyToScreenName = json.getString("in_reply_toS_screenName");
            favorited = getBoolean("favorited", json);
            truncated = getBoolean("truncated", json);
            thumbnailPic = json.getString("thumbnail_pic");
            bmiddlePic = json.getString("bmiddle_pic");
            originalPic = json.getString("original_pic");
            repostsCount = json.getInt("reposts_count");
            commentsCount = json.getInt("comments_count");
            annotations = json.getString("annotations");
            if (!json.isNull("user"))
                user = new User(json.getJSONObject("user"));
            if (!json.isNull("retweeted_status")) {
                retweetedStatus = new Status(json.getJSONObject("retweeted_status"));
            }
            mlevel = json.getInt("mlevel");
            geo = json.getString("geo");
            if (geo != null && !"".equals(geo) && !"null".equals(geo)) {
                getGeoInfo(geo);
            }
            if (!json.isNull("visible")) {
                visible = new Visible(json.getJSONObject("visible"));
            }
        } catch (JSONException je) {
            throw new WeiboException(je.getMessage() + ":" + json.toString(), je);
        }
    }