<< Back to previous view

[CONTRIB-91] json end-of-file handling broken Created: 15/Aug/10  Updated: 17/Sep/10  Resolved: 17/Sep/10

Status: Closed
Project: Clojure-Contrib
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect
Reporter: Anonymous Assignee: rasmus.svensson
Resolution: Completed Votes: 0
Labels: None


When read-json encounters an end-of-file, an IllegalArgumentException is thrown regardless of the user's eof preferences. This can easily be reproduced by running:

(read-json "")
which throws the exception
<pre><code>java.lang.IllegalArgumentException: Value out of range for char: -1
This is caused by the .read method of the Reader returning -1 when the end is reached. (.read returns an int.) This value is then passed to 'char', which tries to make the corresponding character from the code point number. However, -1 is not a valid code point, so it throws an exception.

A solution is to check for equality to -1 before trying to convert to a character. I also have an idea for a helper function that could be used:
<pre><code>(defn- read-char
  "Reads a character from a Reader. Returns nil if the end of the stream is reached"
  (let [x (.read stream)]
    (if (not= x -1)
      (char x))))

This function will always return either a Character or nil. Using it would make it possible to have the eof case along the other cases in the existing cond forms.

Comment by Assembla Importer [ 17/Sep/10 6:53 PM ]

Converted from http://www.assembla.com/spaces/clojure/tickets/91
fix91-1.patch - https://www.assembla.com/spaces/clojure/documents/bYSqjYRuWr37WWeJe5cbCb/download/bYSqjYRuWr37WWeJe5cbCb

Comment by Assembla Importer [ 17/Sep/10 6:53 PM ]

stuart.sierra said: [file:bYSqjYRuWr37WWeJe5cbCb]: fix, without auxiliary function

Comment by Assembla Importer [ 17/Sep/10 6:53 PM ]

stuart.sierra said: (In revision:5a928e263ab88cb8d224de8585932f936aa30c8f) Fix EOF-handling in JSON reader; refs #91

Branch: master

Generated at Thu Oct 19 13:23:00 CDT 2017 using JIRA 4.4#649-r158309.