<< Back to previous view

[DJSON-22] Improper parsing of numbers - leading zeroes should be disallowed Created: 28/Jul/15  Updated: 30/Jul/15

Status: Open
Project: data.json
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Matthew Gilliard Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File djson-22.patch    

 Description   

Handling of numeric literals doesn't perform according to the JSON spec.

Example:

(require '[clojure.data.json :as json])
(json/read-str "0123")
(json/read-str "{\"num\": 0123}")

Both of these examples parse the number as 123. According to the spec, this should actually be an invalid number and throw an exception. NB this restriction does not seem to apply to a number in the exponent, so a number like 1e0003 should be parsed as 1000.0. We handle this case correctly now.



 Comments   
Comment by Matthew Gilliard [ 30/Jul/15 10:34 AM ]

Fix + Tests. Feedback welcome.





[DJSON-21] Improper parsing of literals Created: 07/Jul/15  Updated: 28/Jul/15

Status: Open
Project: data.json
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Mike Sukmanowsky Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Handling of numeric literals doesn't perform according to the JSON spec.

Example:

(require '[clojure.data.json :as json])
(json/read-str "123abc")

Returns the number 1232. According to the spec, this should actually be an invalid literal and throw an exception:



 Comments   
Comment by Matthew Gilliard [ 28/Jul/15 5:39 PM ]

(I assume there's a typo in the description - 123 is returned, not 1232)

It's not just literal values, non-whitespace at the end of any input is silently ignored and should be rejected:

(json/read-str "{}xxx")   =>  {}
(json/read-str "[]yyy")   =>  []
(json/read-str "\"\"zzz") =>  ""

NB This behaviour agrees with the docstring ("Reads a single item of JSON data from ...").





[DJSON-18] Fast way to print indented json Created: 15/Dec/14  Updated: 15/Dec/14

Status: Open
Project: data.json
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Major
Reporter: Nikita Prokopov Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File djson_18_fast_indent.patch    

 Description   

Hi!

Formatted json is very handy for human consumption, for example, while debugging or exploring JSON API. data.json offers formatting in a form of pprint-json. Problem is, pprint-json is dead slow because it tries to fit everything within some line width limit. In practice it takes 20-100 times more time to use pprint-json instead of write-str, up to the point where it just cannot be used in production:

clojure.data.json=> (def data (read-string (slurp "sample.edn")))
#'clojure.data.json/data
clojure.data.json=> (count data)
4613
clojure.data.json=> (time (do (clojure.data.json/write-str data) nil))
"Elapsed time: 219.33 msecs"
clojure.data.json=> (time (do (with-out-str (clojure.data.json/pprint-json data)) nil))
"Elapsed time: 25271.549 msecs"

Proposed enhancement is very simple: indent new keys and array elements, but do not try to fit values into line width limit. For human, JSON formatted this way is still easy consumable, structure is evident. The only downside is that some lines might become very long.

In a patch attached, I modified write-array and write-object, added new :indent option to write. To print indented json, one can write now: (write-str data :indent true)

There's some performance penalty, of course, but relatively small:

clojure.data.json=> (time (do (clojure.data.json/write-str data :indent true) nil))
"Elapsed time: 250.18 msecs"

I also fixed small bug: (seq m) thing in write-object should be (seq x).






Generated at Tue Aug 04 13:09:23 CDT 2015 using JIRA 4.4#649-r158309.