当前位置: 首页 > 知识库问答 >
问题:

IntelliJ IDE显示Gson成功地将字符串转换为对象,但当我导出到Jar时,它会显示“预期的BEGIN_对象,但它是字符串”

史钊
2023-03-14

我有两个文本文件:PatientForms。txt和主代码列表。txt。

每个文件的每一行都包含一个JSON字符串。例如,我使用以下方法读入文件的内容并将其存储在SortedMap中。

这是我的服务代码。java代码:

public class ServiceCode {

//class variables
@SerializedName("code")
private String code;

@SerializedName("description")
private String description;

@SerializedName("cost")
private double fullRetailPrice;

//constructor: default - creates an empty code that can be modified by user
public ServiceCode() {
    setCode("Empty");
    setDescription("Empty");
    setFullRetailPrice(0.0);
}

//constructor: non-default - creates a code with values passed to it for code, description, and fullRetailPrice
public ServiceCode(String code, String description, double fullRetailPrice) {
    setCode(code);
    setDescription(description);
    setFullRetailPrice(fullRetailPrice);
}

//setters
public void setCode(String code) { this.code = code; }
public void setDescription(String description) { this.description = description; }
public void setFullRetailPrice(double fullRetailPrice) { this.fullRetailPrice = fullRetailPrice; }

//getters
public String getCode() { return code; }
public String getDescription() { return description; }
public double getFullRetailPrice() { return fullRetailPrice; }

以下是我读取文件并将其放置在地图中的方法:

public class CodeFileHandler {

//static final File dir = new File(".");
static final Gson gson = new Gson();

public SortedMap<String, ServiceCode> loadCodeList() {
    SortedMap<String, ServiceCode> map = new TreeMap<>();
    List<String> codeStrings = new ArrayList<>();

    try {
        String loc = "MasterCodeList.txt";
        BufferedReader br = new BufferedReader(new FileReader(loc));

        for(String line; (line = br.readLine()) != null; ) {
            codeStrings.add(line);
            System.out.println(line);
        }
        // line is not visible here.
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    for (String s : codeStrings) {
        //used to show that string is a valid JSON format
        System.out.println(s);

        ServiceCode c = gson.fromJson(s, ServiceCode.class);
        map.put(c.getCode(), c);
    }

    return map;
}

所以,问题是这在IntelliJ中没有错误,但是当我从我的jar文件中运行它时,我得到了一个错误。当我运行程序时,IDE输出的字符串显示了一个有效的格式:

{"code":"D0120","description":"Periodic oral evaluation-established pt","cost":39.0}

当我从jar文件运行它时,我得到了以下信息:

F:\BLCHC\u MCv1\out\artifacts\BLCHC\u MCv1\u jar

在过去的几天里,我查看的所有来源都指向在开始时用“代替{”读取的字符串。事实并非如此。

有人知道为什么会发生这种情况吗?当我访问病人orms.txt时,从不同的文件加载没有问题,即使它是从jar运行的。

使现代化

我将loadCodeList方法更改为:

  public void loadCodeList() {
    try {
        String loc = "MasterCodeList.txt";
        BufferedReader br = new BufferedReader(new FileReader(loc));

        for(String line; (line = br.readLine()) != null; ) {
            ServiceCode s = gson.fromJson(line, ServiceCode.class);
            codeMap.put(s.getCode(), s);
        }
        // line is not visible here.
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我的代码读取每一行,并使用gson将其从JSON格式的字符串转换为ServiceCode对象。fromJson(字符串、服务代码) 其中String是从文件中读入的JSON字符串。

IntelliJ IDE的输出

IDE输出:无错误

在IDE中,我可以毫无故障地运行一切,并访问SortedMap中的ServiceCode对象。

JAR文件输出JAR文件控制台输出

我没有正确打包jar文件吗?我将Gson Jar包含在我的Jar目录中。


共有1个答案

尹凌龙
2023-03-14

花了很多时间,我终于找到了一种没有错误的方法!我正在阅读如何保存和加载我的地图(保存在一个JSON文件中,包含完整的格式和所有内容),我发现:https://stackoverflow.com/a/32066515/8250178.现在,当我从我的电脑上运行它时,它就工作了。jar文件以及我的IDE。

 类似资料:
  • 我试图使用GSON解析一些非常简单的JSON。这是我的代码: 以下是从url返回的JSON: 我得到了一个例外: 有什么想法吗?我是格森的新手。

  • 我试图将JSON字符串转换为HashMap。下面是我的一些代码: 在这些行的最后一行(我在其中设置数据)抛出异常。 JSON字符串是 {"body":"body","start Date":"2014-05-30 11:00:00","endDate":"2014-05-30 12:00:00","位置":"位置","主题":"主题!"} 我得到的例外是 线程“main”java中出现异常。朗,反

  • 使用改装库来使用一项服务,我为我的界面、模型以及如何使用界面添加了代码。 我不断收到一个GSON抛出的“预期的BEGIN_对象,但是BEGIN_数组” 界面 模范公立班学生{ 我怎么称呼方法

  • 当我将json转换为gson时,我得到了以下错误: E/AndroidRuntime(1142):com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY,但BEGIN_OBJECT位于第1行第51列

  • 问题 你想改变对象实例的打印或显示输出,让它们更具可读性。 解决方案 要改变一个实例的字符串表示,可重新定义它的 __str__() 和 __repr__() 方法。例如: class Pair: def __init__(self, x, y): self.x = x self.y = y def __repr__(self):

  • 问题内容: 我试图将字符串转换为日期时间对象。我从新闻提要中获取的字符串格式如下:“星期四,2014年10月16日美国东部时间01:16:17” 我尝试使用datetime.strptime()进行转换。即 并得到以下错误: 追溯(最近一次通话最近): 文件“”,第1行,位于datetime.strptime(’Thu,16 Oct 2014 01:16:17 EDT’,’%a,%d%b%Y%H: