2015-01-14 63 views
0

如何檢查java.io.InputStream(來自FileURL,..)的數據是否屬於JSON類型?如何確定InputStream是否包含JSON數據?


當然是完整最好是先裝載流的全部數據,並嘗試驗證它作爲JSON(例如檢查用於閉合支架})。由於流源可能非常大(一個大小爲500MB的GeoJSON文件),因此最終會在刻錄機中結束。

爲了避免這種情況,我寫一個小方法,該方法只對InputStream爲UTF-8/16/32和試驗的第一個字符,如果它是根據RFC 4627(其由RFC 7159參照及更新),以確定一個{其JSON性質:

JSON文本應以Unicode編碼。默認編碼是UTF-8。

和:

由於JSON文本的前兩個字符永遠是ASCII字符 [RFC0020],有可能確定一個八位組 流是否是UTF-8,UTF- 16(BE或LE)或UTF-32(BE或LE),前四個八位字節中的空值模式爲 。

 00 00 00 xx UTF-32BE 
     00 xx 00 xx UTF-16BE 
     xx 00 00 00 UTF-32LE 
     xx 00 xx 00 UTF-16LE 
     xx xx xx xx UTF-8 

的方法是:

public static boolean mightBeJSON(InputStream stream) { 
    try { 
     byte[] bytes = new byte[1]; 

     stream.read(bytes); 
     if (bytes[0] == 0x7B) { 
      return true; 
     } 

     stream.read(bytes); 
     if (bytes[0] == 0x7B) { 
      return true; 
     } 

     stream.read(bytes); 
     stream.read(bytes); 
     if (bytes[0] == 0x7B) { 
      return true; 
     } 
    } catch (IOException e) { 
     // Nothing to do; 
    } 

    return false; 
} 

直到現在我的機器仍然不燃燒,而是:

  • 有什麼不對這種方法/實現?
  • 在某些情況下可能會有問題嗎?
  • 有什麼需要改進的地方?
+1

RFC 4627 **已過時**。請參考[RFC 7159](http://rfc7159.net/rfc7159)。 –

+0

我跟着你的鏈接[RFC 7159](http://rfc7159.net/rfc7159)。我是唯一一個不信任使用不是[普通,未格式化文本]的網站的RFC(https://www.rfc-editor.org/rfc/rfc7159.txt)? :D –

+0

是的,這只是你! ;-) –

回答

1

RFC 7159狀態:

8.字符串和字符問題

8.1字符編碼

JSON文本以UTF-8編碼,UTF- 16或UTF-32。 默認編碼是UTF-8,並且以UTF-8 編碼的JSON文本是可互操作的,因爲它們將被成功讀取爲 的最大實現數;有很多實現 ,無法成功讀取其他編碼中的文本(如UTF-16 和UTF-32)。

實現絕不能添加一個字節順序標記到 的一個JSON文本的開頭。爲了互操作性,解析JSON文本的實現 可以忽略字節順序標記 的存在,而不是將其視爲錯誤。

這並不回答你的問題,但我希望它可以幫助你的邏輯。

相關問題