【问题标题】:How to read/write a location from/to a json file with Rascal如何使用 Rascal 从/向 json 文件读取/写入位置
【发布时间】:2020-01-20 22:03:09
【问题描述】:

我们正在使用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>))

有没有更好的方法将loc 实例序列化/反序列化为 JSON 文件?

感谢您的帮助!

【问题讨论】:

    标签: rascal


    【解决方案1】:

    一种解决方案是将位置写为 JSon 对象而不是字符串,如下所示:

    writeJSON(|file:///tmp/test.json|,metrics, unpackedLocations=true);
    

    在读回文件时,解析器将看到它必须通过解释每个字段的名称将对象转换回流氓源位置。

    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
    

    【讨论】:

    • 实际上,在尝试之后(并且不得不重新启动终端几次),这似乎不起作用。无论 unpackedLocations 的值如何,JSON 文件的内容都是相同的?并且读取文件失败并显示相同的错误消息。
    • 好的,谢谢;也许参数名称中的错字?否则我会去进行调试会话。
    • 它对我有用..也许这是由于 Eclipse 中的“刷新”问题? eclipse 文件系统有时会与实际文件系统过时,“刷新”可以解决此问题。
    • 我多次重新启动所有内容。每次都是同样的问题。我删除了文件,所以我确定这不会导致任何问题:rascal&gt;writeJSON(|file:///tmp/test.json|,metrics, unpackedLocations=true); ok rascal&gt;metrics = readJSON(#map[str, loc], |file:///tmp/test.json|); |std:///lang/json/IO.rsc|(925,2980,&lt;30,0&gt;,&lt;58,160&gt;): IO("could not parse URI:$.test") at *** somewhere ***(|std:///lang/json/IO.rsc|(925,2980,&lt;30,0&gt;,&lt;58,160&gt;)) at readJSON(|std:///lang/json/IO.rsc|(3873,30,&lt;58,128&gt;,&lt;58,158&gt;))
    • 代码在我的队友运行 Linux 的工作站上运行良好。可能是我安装的问题。我会认为它已解决。再次感谢尤尔根!
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2021-04-30
    • 2019-10-06
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多