如何使用 Rascal read/write 一个位置 from/to 一个 json 文件
How to read/write a location from/to a json file with Rascal
我们正在使用 lang::json::IO::writeJSON()
函数将一些数据序列化到 JSON 文件。
在我们尝试存储方法位置之前,这一直很有效。
一个位置包含 <
和 >
字符之间的起始行和列,这显然不是写入 JSON 文件的问题(它被写成一个字符串,而不是试图解析任何东西)。
当您想将 lang::json::IO::readJSON
与存储为字符串的位置一起使用时,问题就出现了。 Rascal 尝试将字符串解析为对象,但失败了。
例如:
rascal>map[str, loc] metrics = ();
map[str, loc]: ()
rascal>metrics["test"] = a;
map[str, loc]: ("test":|project:///rascal/bla.java|(0,0,<0,0>,<1,0>))
rascal>writeJSON(|file:///tmp/test.json|,metrics);
ok
rascal>metrics = readJSON(#map[str, loc], |file:///tmp/test.json|);
|std:///lang/json/IO.rsc|(925,2980,<30,0>,<58,160>): IO("could not parse URI:$.test")
at *** somewhere ***(|std:///lang/json/IO.rsc|(925,2980,<30,0>,<58,160>))
at readJSON(|std:///lang/json/IO.rsc|(3873,30,<58,128>,<58,158>))
是否有更好的方法将 serialize/unserialize loc
个实例写入 JSON 文件?
感谢您对此的帮助!
一个解决方案是将位置写为 JSon 对象而不是字符串,如下所示:
writeJSON(|file:///tmp/test.json|,metrics, unpackedLocations=true);
当回读文件时,解析器将看到它必须通过解释每个字段的名称将对象转换回 Rascal 源位置。
rascal>l = |project://x/y/z|(10,10,<1,2>,<3,4>);
loc: |project://x/y/z|(10,10,<1,2>,<3,4>)
rascal>writeJSON(|home:///example.txt|, [l], unpackedLocations=true)
ok
rascal>println(readFile(|home:///example.txt|))
[{"scheme":"project","authority":"x","path":"/y/z","offset":10,"length":10,"begin":[1,2],"end":[3,4]}]
rascal>readJSON(#list[loc], |home:///example.txt|)
list[loc]: [|file:///y/z|(10,10,<1,2>,<3,4>)]
ok
我们正在使用 lang::json::IO::writeJSON()
函数将一些数据序列化到 JSON 文件。
在我们尝试存储方法位置之前,这一直很有效。
一个位置包含 <
和 >
字符之间的起始行和列,这显然不是写入 JSON 文件的问题(它被写成一个字符串,而不是试图解析任何东西)。
当您想将 lang::json::IO::readJSON
与存储为字符串的位置一起使用时,问题就出现了。 Rascal 尝试将字符串解析为对象,但失败了。
例如:
rascal>map[str, loc] metrics = ();
map[str, loc]: ()
rascal>metrics["test"] = a;
map[str, loc]: ("test":|project:///rascal/bla.java|(0,0,<0,0>,<1,0>))
rascal>writeJSON(|file:///tmp/test.json|,metrics);
ok
rascal>metrics = readJSON(#map[str, loc], |file:///tmp/test.json|);
|std:///lang/json/IO.rsc|(925,2980,<30,0>,<58,160>): IO("could not parse URI:$.test")
at *** somewhere ***(|std:///lang/json/IO.rsc|(925,2980,<30,0>,<58,160>))
at readJSON(|std:///lang/json/IO.rsc|(3873,30,<58,128>,<58,158>))
是否有更好的方法将 serialize/unserialize loc
个实例写入 JSON 文件?
感谢您对此的帮助!
一个解决方案是将位置写为 JSon 对象而不是字符串,如下所示:
writeJSON(|file:///tmp/test.json|,metrics, unpackedLocations=true);
当回读文件时,解析器将看到它必须通过解释每个字段的名称将对象转换回 Rascal 源位置。
rascal>l = |project://x/y/z|(10,10,<1,2>,<3,4>);
loc: |project://x/y/z|(10,10,<1,2>,<3,4>)
rascal>writeJSON(|home:///example.txt|, [l], unpackedLocations=true)
ok
rascal>println(readFile(|home:///example.txt|))
[{"scheme":"project","authority":"x","path":"/y/z","offset":10,"length":10,"begin":[1,2],"end":[3,4]}]
rascal>readJSON(#list[loc], |home:///example.txt|)
list[loc]: [|file:///y/z|(10,10,<1,2>,<3,4>)]
ok