Zulip Chat Archive
Stream: general
Topic: JSON parsing
Alexandre Rademaker (Jul 23 2024 at 18:39):
I didn't find in https://reservoir.lean-lang.org any JSON parser that could report for me more than just the error (Except String Lean.Json) but also the position in the string where the error was found.
Does anyone know about a JSON parser for Lean that could be more informative for validation?
Henrik Böving (Jul 23 2024 at 18:43):
If you look at the impelemtnation of src#Lean.Json.parse you'll see that it does internally know where the offset is so you can write a very thing wrapper similar to parse itself around the internals to extract that information if you want
Alexandre Rademaker (Jul 23 2024 at 19:04):
Actually, after your pointer, the problem is not in the parser... but in the fromJson?
structure Value where
description : String
value : Float
unit : String
deriving Lean.FromJson, Lean.ToJson, Repr
structure Product where
description : String
material_type : String
provenance : String
energy_source_equipment : String
conditions : List Value
reactants : List Value
solvents : List Value
deriving Lean.FromJson, Lean.ToJson, Repr
structure Annotation where
input : String
output : List Product
deriving Lean.FromJson, Lean.ToJson, Repr
def test (filename : System.FilePath) : IO (Except String (List Annotation)) := do
let txt ← IO.FS.readFile filename
pure $ Lean.Json.parse txt >>= Lean.fromJson?
The output is
Except.error "Annotation.output: Product.conditions: Value.value: Expected a number or a string 'Infinity', '-Infinity', 'NaN'."
I need to understand how the errors are propagated in a nested structure. But if Lean.Json.parse (s : String) : Except String Lean.Json returns a Lean.Json, I believe I lose the offset information of the original string.
Last updated: May 02 2025 at 03:31 UTC