【问题标题】:No suitable method found for parse(java.io.InputStream)没有找到适合 parse(java.io.InputStream) 的方法
【发布时间】:2018-11-11 16:42:26
【问题描述】:

我是用 Java 写的:

import java.io.FileReader;
import java.util.Iterator;

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

public class Example1 {
 public static String readReddit()throws IOException, URISyntaxException {   

    JSONParser parser = new JSONParser();
    try {
        Object obj = parser.parse(Example1.class.getClassLoader().getResourceAsStream("data/reddit/redditdump.json"));

        JSONObject jsonObject = (JSONObject) obj;
        String kind = (String) jsonObject.get("kind");
        JSONArray data = (JSONArray) jsonObject.get("data");

        System.out.println("Kind:" + kind);
        System.out.println("Data:");
        Iterator<String> iterator = data.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }catch (Exception e){
        e.printStackTrace();
    }
 return null;
}

在maven中有这些依赖:

<dependency>
   <groupId>com.googlecode.json-simple</groupId>
   <artifactId>json-simple</artifactId>
   <version>1.1.1</version>
</dependency>

我想从这个 JSON 文件中读取:

[{
    "kind": "Listing",
    "data": {
        "modhash": "",
        "children": [{
            "kind": "t3",
            "data": {
                "contest_mode": false,
                "banned_by": null,
                "media_embed": {

                },
                "subreddit": "PoliticalDiscussion",
                "selftext_html": "&lt;!-- SC_OFF --&gt;&lt;div class=\"md\"&gt;&lt;p&gt;The first Presidential Debate for the 2016 Elections will air tonight at 9:00PM Eastern at Hofstra University in New York. The debate will feature Donald Trump and Hillary Clinton in their first head-to-head televised debate. The debate will be 90 minutes and commercial free.&lt;/p&gt;\n\n&lt;p&gt;The Debate is hosted by the Commission on Presidential Debates and will be moderated by NBC’s Lester Holt. Hillary Clinton will &lt;a href=\"https://twitter.com/CBSNews/status/780506360257675264\"&gt;receive the first question&lt;/a&gt;.&lt;/p&gt;\n\n&lt;hr/&gt;\n\n&lt;h2&gt;&lt;strong&gt;Where to Watch&lt;/strong&gt;&lt;/h2&gt;\n\n&lt;p&gt;Unlike the primaries, these debates are hosted by the Commission on Presidential Debates and the broadcast is not restricted to one network, making for a wide range of viewing options. Here are just a few of the ways you can watch:&lt;/p&gt;\n\n&lt;p&gt;&lt;strong&gt;Television:&lt;/strong&gt;&lt;/p&gt;\n\n&lt;p&gt;The event will be broadcast on most major TV channels, including ABC, CBS, CNN, C-SPAN, Fox News, MSNBC, and Univision.&lt;/p&gt;\n\n&lt;p&gt;&lt;strong&gt;Live Streams:&lt;/strong&gt;&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"https://www.c-span.org/2016presidentialDebates/\"&gt;C-SPAN&lt;/a&gt;&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"https://www.youtube.com/watch?v=L6QElWIKfDk\"&gt;Washington Post (YouTube)&lt;/a&gt;&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"https://www.youtube.com/watch?v=EuHuzhzb1nc\"&gt;PBS (YouTube)&lt;/a&gt;&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"https://www.youtube.com/watch?v=855Am6ovK7s\"&gt;NBC (YouTube)&lt;/a&gt;&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"https://twitter.com/i/live/778347749217406976\"&gt;Bloomberg Politics (Twitter with real-time fact checking)&lt;/a&gt;&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"https://www.facebook.com/ABCNews/\"&gt;ABC (Facebook)&lt;/a&gt;&lt;/p&gt;\n\n&lt;hr/&gt;\n\n&lt;h2&gt;&lt;strong&gt;Live Discussion&lt;/strong&gt;&lt;/h2&gt;\n\n&lt;p&gt;If you&amp;#39;d like to participate in real-time discussion, we encourage you to head over to &lt;a href=\"https://discord.gg/caAhhCv\"&gt;our Discord server&lt;/a&gt; and check out our &lt;a href=\"https://discordapp.com/channels/154635757615710208/229738984618721280\"&gt;Presidential Debate Channel&lt;/a&gt;. &lt;/p&gt;\n\n&lt;hr/&gt;\n\n&lt;p&gt;Please use this thread to discuss your tonight&amp;#39;s debate as it happens. All subreddit rules still apply in live threads and in Discord, so please remember to remain civil and try to keep discussion quality high. &lt;strong&gt;This thread will be closely watched, and any rule violations are certain to be met with heavy-handed moderation. Be nice!&lt;/strong&gt;&lt;/p&gt;\n&lt;/div&gt;&lt;!-- SC_ON --&gt;",
                "selftext": "The first Presidential Debate for the 2016 Elections will air tonight at 9:00PM Eastern at Hofstra University in New York. The debate will feature Donald Trump and Hillary Clinton in their first head-to-head televised debate. The debate will be 90 minutes and commercial free.\n\nThe Debate is hosted by the Commission on Presidential Debates and will be moderated by NBC’s Lester Holt. Hillary Clinton will [receive the first question](https://twitter.com/CBSNews/status/780506360257675264).\n\n-----\n\n**Where to Watch**\n-\n\nUnlike the primaries, these debates are hosted by the Commission on Presidential Debates and the broadcast is not restricted to one network, making for a wide range of viewing options. Here are just a few of the ways you can watch:\n\n**Television:**\n\nThe event will be broadcast on most major TV channels, including ABC, CBS, CNN, C-SPAN, Fox News, MSNBC, and Univision.\n\n**Live Streams:**\n\n[C-SPAN](https://www.c-span.org/2016presidentialDebates/)\n\n[Washington Post (YouTube)](https://www.youtube.com/watch?v=L6QElWIKfDk)\n\n[PBS (YouTube)](https://www.youtube.com/watch?v=EuHuzhzb1nc)\n\n[NBC (YouTube)](https://www.youtube.com/watch?v=855Am6ovK7s)\n\n[Bloomberg Politics (Twitter with real-time fact checking)](https://twitter.com/i/live/778347749217406976)\n\n[ABC (Facebook)](https://www.facebook.com/ABCNews/)\n\n------\n\n**Live Discussion**\n-\n\nIf you'd like to participate in real-time discussion, we encourage you to head over to [our Discord server](https://discord.gg/caAhhCv) and check out our [Presidential Debate Channel](https://discordapp.com/channels/154635757615710208/229738984618721280). \n\n----------\n\nPlease use this thread to discuss your tonight's debate as it happens. All subreddit rules still apply in live threads and in Discord, so please remember to remain civil and try to keep discussion quality high. **This thread will be closely watched, and any rule violations are certain to be met with heavy-handed moderation. Be nice!**",
                "likes": null,
                "suggested_sort": "new",
                "user_reports": [],
                "secure_media": null,
                "saved": false,
                "id": "54nuut",
                "gilded": 0,
                "secure_media_embed": {                 
                },
                "clicked": false,
                "report_reasons": null,
                "author": "BagOnuts",
                "media": null,
                "score": 550,
                "approved_by": null,
                "over_18": false,
                "domain": "self.PoliticalDiscussion",
                "hidden": false,
                "num_comments": 8576,
                "thumbnail": "",
                "subreddit_id": "t5_2sfmf",
                "edited": 1474937730,
                "link_flair_css_class": "green2",
                "author_flair_css_class": "",
                "downs": 0,
                "archived": false,
                "removal_reason": null,
                "stickied": false,
                "is_self": true,
                "hide_score": false,
                "permalink": "/r/PoliticalDiscussion/comments/54nuut/debate_megathread_live_discussion_thread_for_the/",
                "locked": false,
                "name": "t3_54nuut",
                "created": 1474964458,
                "url": "https://www.reddit.com/r/PoliticalDiscussion/comments/54nuut/debate_megathread_live_discussion_thread_for_the/",
                "author_flair_text": "Extra Nutty",
                "quarantine": false,
                "title": "[Debate Megathread] LIVE Discussion Thread for the First Presidential Debate of 2016",
                "created_utc": 1474935658,
                "link_flair_text": "Presidential Debate",
                "ups": 550,
                "upvote_ratio": 0.83,
                "mod_reports": [],
                "visited": false,
                "num_reports": null,
                "distinguished": null
            }
        }],
        "after": null,
        "before": null
    }
},
{
    "kind": "Listing",
    "data": {
        "modhash": "",
        "children": [{
            ..

但我得到一个错误:

错误:(132, 32) java: 找不到合适的方法 解析(java.io.InputStream)

方法 org.json.simple.parser.JSONParser.parse(java.lang.String) 不适用

(参数不匹配;java.io.InputStream 无法转换为 java.lang.String)

方法 org.json.simple.parser.JSONParser.parse(java.io.Reader) 不适用

(参数不匹配;java.io.InputStream无法转换为java.io.Reader)

我没有找到问题所在。此外,我不只是想打印我得到的这些结果,而是保存并使用它们。我在 Java 方面不是很有经验。任何帮助将不胜感激。也许我没有导入任何依赖项?

【问题讨论】:

  • 问题正如错误消息所说。您的磁盘上没有这样的文件。该文件是一个相对文件,因此它是从执行用于启动程序的java 命令的目录中搜索的。
  • @JBNizet 但我的磁盘中有这样的文件。这就是问题所在!
  • 你看完我的评论了吗?执行 java 命令的目录的绝对路径是什么? JSON文件的绝对路径是什么?
  • 要查看 Java 尝试读取的文件,您可以在尝试打开文件之前添加 System.out.println(new File("data/reddit/redditdump.json").getAbsolutePath());
  • @JBNizet 我试过写目录的绝对路径,没用/Users/myname/Desktop/javajson/src/main/resources/data/reddit/redditdump.json

标签: java json


【解决方案1】:

你能试试下面的代码吗?

ClassLoader classLoader = Example1.class.getClassLoader();
File file = new File(classLoader.getResource("data/reddit/redditdump.json").getFile());

Object obj = parser.parse(new FileReader(file));

【讨论】:

  • 我现在收到这个错误:Error:(132, 39) java: non-static method getClass() cannot be referenced from a static context
  • @Gentsview 然后使用JSON1.class 而不是getClass()
  • @f1sh 已经尝试过了,我得到错误:cannot be converted to java.lang.ClassLoader
  • 我将其更改为 Class&lt;JSON1&gt; classLoader = JSON1.class; 它有效,但我现在遇到另一个异常 Class&lt;JSON1&gt; classLoader = JSON1.class;
  • 您需要访问类加载器。使用ClassLoader classLoader = JSON1.class.getClassLoader();
【解决方案2】:

getResourceAsStream 表示您将InputStream 作为返回对象。而你的例外是no suitable method found for parse(java.io.InputStream) 意味着方法parser.parse() 不接受InputStream。您必须查看此方法实现并找出哪些类型的对象接受此方法并将InputStream 转换为其中之一。我看到至少StringReader 是可以接受的,我将InputStream 转换为Reader

public static String readReddit() {
    JSONParser parser = new JSONParser();

    try (Reader reader = new InputStreamReader(Example1.class.getClassLoader().getResourceAsStream("data/reddit/redditdump.json"))) {
        ((JSONArray)parser.parse(reader)).forEach((Consumer<JSONObject>)obj -> {
            String kind = (String)obj.get("kind");
            JSONObject data = (JSONObject)obj.get("data");
            JSONArray children = (JSONArray)data.get("children");
            System.out.println("Kind: " + kind + ", total children: " + children.size());
        });
    } catch(Exception e) {
        e.printStackTrace();
    }

    return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2014-08-27
    • 2021-06-19
    • 2015-11-26
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多