【问题标题】:Read JSON data from a file for use in StringEntity从文件中读取 JSON 数据以在 StringEntity 中使用
【发布时间】:2019-03-20 13:45:24
【问题描述】:

我正在尝试从 JSON 文本文件中读取简单数据并转换为 StringEntity 以用于 API POST 请求。虽然如果数据被硬编码为 StringEntity,我的 API 发布请求可以正常工作,但我正在努力成功解析数据。我用谷歌搜索的所有潜在解决方案都处理对我来说过于复杂的数组。

这是 JSON 文本文件的示例:

{
"data":"d1",
"data2":"d2",
"data3":"d3"
}

这是我用来尝试导入数据的代码。

JSONParser parser = new JSONParser();
    JSONObject a = new JSONObject();
    try {
        FileReader fileReader = new FileReader("/directory/file.json");
        a = (JSONObject) parser.parse(fileReader);
        } catch (Exception e1) {
        e1.printStackTrace();
        }
String data = a.toString();
StringEntity entity = new StringEntity(data);   
entity.setContentType(ContentType.APPLICATION_JSON.getMimeType());
request.addHeader("Accept", acceptHeader);
    request.setEntity(entity);
    HttpResponse response = client.execute(request);

我觉得我在这里某个地方真的很愚蠢。我是新手。当它工作时,StringEntity 是这样硬编码的,所以这就是我需要它导入和解析的方式:

StringEntity entity = new StringEntity("{\"data\":\"d1\",\"data2\":\"d2\",\"data3\":\"d3\"}");

使用的类:

import org.json.JSONObject;
import org.json.JSONArray;
import org.json.simple.parser.JSONParser;

【问题讨论】:

  • 如果你想返回一个 json 响应,为什么要解析你已经拥有的 json?为什么不直接将文件作为文本读取并将该文本传递给StringEntity
  • 我想将 JSON 数据作为 StringEntity 发送到单独的远程 API。我正在构建的小程序是 2 个独立系统的中间人。我假设我需要将原始 json 文本文件解析为更可接受的 httpPost 格式
  • 我不需要这样做吗?
  • 嗯,json 应该是 json(如果它们都符合规范的话),至少文本文件中的数据和硬编码的数据似乎没有什么不同——除了一些空格差异这不应该是一个问题(如果他们是我怀疑这是换行符,但你应该能够删除这些)。您是否尝试将文件的内容直接传递给帖子?
  • 你能发布堆栈跟踪吗?

标签: java string post filereader


【解决方案1】:

以防万一其他人感兴趣...最终得到以下解决方案,因为不需要解析或格式化 JSON:

String data;
data = new String(Files.readAllBytes(Paths.get("file.json")));

需要的库:

import java.nio.file.Paths;
import java.nio.file.Files;

【讨论】:

  • 您是在 2 行上声明 String data 并将值分配给 data 还是只是一个错字?我进一步假设它实际上是Files.readAllBytes() 而不是String.readAllBytes,所以你的代码可能看起来更像String data = new String( Files.readAllBytes(Paths.get("file.json")));
  • 最后请注意,在不提供字符集的情况下从字节数组创建字符串是有风险的:如果文件的编码与系统的默认字符集不同,您将无法获得所需的字符串 - 所以明智的做法是始终为String(byte[], xxx) 构造函数提供一个字符集,其中xxx 是字符集的名称或字符集实例。
  • 是的,有一些错别字(漫长的一天)。感谢您对字符集的提醒。我正在查看 HttpPost 进程的标头,所以我会添加它。
  • 澄清一下,根据问题,这个 sn-p 将继续转换为 HttpPost 的 StringEntity。
  • 将其添加到帖子标题也会有所帮助,但您也应该将其添加到阅读过程中(即当您将字节数组转换为字符串时)。通常,您应该每次从字符串转换为字节或反之亦然指定字符集,否则您可能会在该位置出现编码错误。
【解决方案2】:

由于 Java 11 你可以这样做

var content = Files.readString(Pahts.get("file.json"));
JSONObject json = (JSONObject) new JsonParser().parse(content);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多