开发者社区 问答 正文

从文件创建对象-JAVA

我有一个问题,我应该将一个对象传递给mapper(hadoop的map reduce),因此我尝试将对象放入这样的json中:

Object2ObjectOpenHashMap<OpenBitSet, CombinationHelper> level1 = ...;
 String level1path="pathFile.txt";

 GsonBuilder gsonBuilder = new GsonBuilder();
 Gson gson = gsonBuilder.create();
 String JsonLevel1 = gson.toJson(level1);


 BufferedWriter writerContainTuples = new BufferedWriter(new FileWriter(level1path));
 writerContainTuples.write(JsonLevel1);
 writerContainTuples.close();

在mapper中,我通常以这种方式从文件中获取对象:

public void map(Object ke, Text val, Context context) throws IOException, InterruptedException {


        level1 = new Gson().fromJson(val.toString(), new TypeToken<Object2ObjectOpenHashMap<OpenBitSet, CombinationHelper>>(){}.getType());
        .
        .
        .
         }
        }

但是当我运行程序时,它给了我这个错误:

java.lang.Exception: org.apache.hadoop.shaded.com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3

所以我不知道如果java这样给我这个错误,我该如何传递对象。我已经尝试过可序列化,但是在映射器阶段,它给了我几乎相同的错误。

展开
收起
几许相思几点泪 2019-12-10 19:30:53 621 分享 版权
阿里云 AI 助理回答

从错误信息来看,问题在于Gson在尝试反序列化时期望一个JSON对象(BEGIN_OBJECT),但实际上遇到了字符串(STRING)。这通常意味着你的level1对象被转换为JSON字符串后,可能整个JSON内容被当成了一个单独的字符串值来处理,而不是作为结构化的JSON对象。

确保在写入文件时,你确实得到了一个有效的、结构完整的JSON对象字符串。根据你的代码片段,看起来你已经正确地将level1转换为了JSON字符串并写入了文件。但是,问题可能出在读取和解析这个JSON字符串上。

这里有几个检查点和建议:

  1. 验证生成的JSON:首先确认JsonLevel1变量中的内容确实是正确的JSON格式。你可以打印出来检查一下,确保它以{开始,以}结束,并且内部是合法的键值对结构。

  2. Text vs. BytesWritable:Hadoop的MapReduce框架中,默认的value类型是Text,它适合处理文本数据。但如果你的JSON字符串非常大或者为了效率考虑,可以考虑使用BytesWritable,特别是当你知道JSON字符串的大小时。这样可以直接将字节写入,避免了额外的编码解码开销。

  3. 直接读取文件内容:确保在Mapper中,你正确地读取了整个文件内容作为单个值处理。如果文件只包含一个大的JSON对象,那么直接用val.toString()应该是正确的。但如果是多行或者有其他格式要求,可能需要调整读取逻辑。

  4. TypeToken的具体化:在你的反序列化代码中,你使用了一个匿名的TypeToken。确保这个TypeToken具体指明了你期望的类型,例如new TypeToken<Object2ObjectOpenHashMap<String, YourObjectType>>(){}.getType(),其中YourObjectType是你level1映射中值的实际类型。

  5. 异常处理和日志记录:增加更详细的异常处理和日志记录,可以帮助定位问题所在。特别是在反序列化部分,捕获并打印具体的异常堆栈,可能会揭示更多细节。

如果以上都确认无误,而问题仍然存在,可能需要检查是否有其他环节(如文件读写过程中)引入了意外的字符或格式变化。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: