如何以JSON格式下载WordPress数据?

时间:2019-04-17 15:31:21

标签: java android json wordpress

我正在创建一个Android应用,该应用使用其REST API从WordPress网站获取其数据。但是到目前为止,由于缺乏资源,我无法解决这个问题。

因此,到目前为止,我只是想以JSON格式下载WordPress数据,将其保存在本地,然后使用它来解析并填充应用程序中的内容。是否有一个流程或插件可以帮助我下载JSON格式的WordPress文章?

3 个答案:

答案 0 :(得分:0)

您可以下载CSV格式的文章并将其转换为JSON,有在线工具可以做到这一点。或者您可以使用插件以JSON格式下载:https://wordpress.org/plugins/hiweb-export-posts/

答案 1 :(得分:0)

我认为在JSON中检索Wordpress数据的一个好的解决方案是使用REST API。使用API​​,您将能够检索JSON格式的帖子,类别,标签,评论等。

您可以在REST API Handbook

上查看REST API参考。

答案 2 :(得分:0)

默认情况下,WordPress REST API输出JSON,因此您不需要任何插件。

您没有说是在应用程序中使用Java还是Kotlin,因此我在Java中创建了一个有效的示例,只是为了让更多用户使用它。我试图使代码尽可能简单,而不使用任何第三方库进行联网和JSON解析。

具有联网权限的清单文件。需要联网:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.example.wordpressfetchdata">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

主要活动:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private static final String WORDPRESS_SITE_URL = "http://10.0.2.2/wordpress"; //Use http://10.0.2.2 to access Wordpress running on localhost from emulator on same PC
    private static final String WORDPRESS_REST_API_URL = WORDPRESS_SITE_URL + "/wp-json/wp/v2";
    private static final String WORDPRESS_REST_API_POSTS_URL = WORDPRESS_REST_API_URL + "/posts";
    private static final String NEW_LINE = "\n";

    private TextView contentView;
    private LoadWordpressPostsTask loadWordpressPostsTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        contentView = findViewById(R.id.content);

        loadPostsFromWordpress();
    }

    private void loadPostsFromWordpress() {
        //Create a AsyncTask which will load data on a background thread
        loadWordpressPostsTask = new LoadWordpressPostsTask();
        loadWordpressPostsTask.setListener(new LoadWordpressPostsTask.LoadListener() {
            @Override
            public void onLoadSuccess(List<WordpressPost> data) {
                showPosts(data);
            }

            @Override
            public void onLoadFailure(String errorMessage) {
                showLoadError(errorMessage);
            }
        });
        loadWordpressPostsTask.execute(WORDPRESS_REST_API_POSTS_URL);
    }

    private void showLoadError(String errorMessage) {
        if (contentView != null) {
            contentView.setText(errorMessage);
        }
    }

    private void showPosts(List<WordpressPost> posts) {
        if (contentView != null) {
            int numPosts = posts.size();
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(String.format(Locale.getDefault(), "Loaded %d posts from Wordpress", numPosts));
            stringBuilder.append(NEW_LINE);
            for (WordpressPost post : posts) {
                stringBuilder.append(NEW_LINE);
                stringBuilder.append("Title: ");
                stringBuilder.append(post.getTitle());
                stringBuilder.append(NEW_LINE);
                stringBuilder.append("Content: ");
                stringBuilder.append(post.getContent());
            }
            contentView.setText(stringBuilder.toString());
        }
    }

    @Override
    protected void onDestroy() {
        //Remove listener and AsyncTask to avoid memory leak
        if (loadWordpressPostsTask != null) {
            loadWordpressPostsTask.setListener(null);
            loadWordpressPostsTask = null;
        }
        super.onDestroy();
    }


    private static class LoadWordpressPostsTask extends AsyncTask<String, Void, LoadWordpressPostsTask.LoadResult> {
        private LoadListener listener;

        interface LoadListener {
            void onLoadSuccess(List<WordpressPost> result);

            void onLoadFailure(String errorMessage);
        }

        void setListener(LoadListener listener) {
            this.listener = listener;
        }

        class LoadResult {
            private List<WordpressPost> posts;
            private String errorMessage;

            LoadResult(List<WordpressPost> posts) {
                this.posts = posts;
            }

            LoadResult(String errorMessage) {
                this.errorMessage = errorMessage;
            }

            boolean hasError() {
                return errorMessage != null;
            }
        }

        @Override
        protected LoadResult doInBackground(String... urls) {
            LoadResult result = null;
            if (!isCancelled() && urls != null && urls.length > 0) {
                String urlString = urls[0];
                try {
                    String jsonData = loadJsonDataFromWordpress(urlString);
                    Log.d(TAG, String.format(Locale.getDefault(), "Got data from %s : %s", urlString, jsonData));

                    if (!isCancelled()) {
                        List<WordpressPost> posts = parseJsonData(jsonData);
                        result = new LoadResult(posts);
                    }

                } catch (IOException | JSONException e) {
                    result = new LoadResult(e.getMessage());
                }
            }
            return result;
        }

        private List<WordpressPost> parseJsonData(String jsonData) throws JSONException {
            List<WordpressPost> wordpressPosts = new ArrayList<>();
            JSONArray posts = new JSONArray(jsonData);
            for (int i = 0; i < posts.length(); i++) {
                //For  response properties see: https://developer.wordpress.org/rest-api/reference/posts/#schema
                JSONObject postObject = posts.getJSONObject(i);

                JSONObject titleObject = postObject.getJSONObject("title");
                String title = titleObject.getString("rendered");

                JSONObject contentObject = postObject.getJSONObject("content");
                String content = contentObject.getString("rendered");

                WordpressPost wordpressPost = new WordpressPost(title, content);
                wordpressPosts.add(wordpressPost);
            }
            return wordpressPosts;
        }

        @Override
        protected void onPostExecute(LoadResult result) {
            if (!isCancelled() && listener != null) {
                if (result != null) {
                    if (result.hasError()) {
                        listener.onLoadFailure(result.errorMessage);
                    } else {
                        List<WordpressPost> posts = result.posts;
                        listener.onLoadSuccess(posts);
                    }
                } else {
                    listener.onLoadFailure("No result!");
                }
            }
        }

        private String loadJsonDataFromWordpress(String urlString) throws IOException {
            String jsonData = null;
            HttpURLConnection connection = null; //Change this to HttpsURLConnection when using HTTPS, which you should be using!
            try {
                URL url = new URL(urlString);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();
                int responseCode = connection.getResponseCode();
                if (responseCode != HttpURLConnection.HTTP_OK) {
                    throw new IOException("HTTP error code: " + responseCode);
                }
                try (InputStream stream = connection.getInputStream()) {
                    if (stream != null) {
                        Reader inputStreamReader = new InputStreamReader(stream, StandardCharsets.UTF_8);
                        try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                            StringBuilder buffer = new StringBuilder();
                            String line;
                            while ((line = bufferedReader.readLine()) != null) {
                                buffer.append(line);
                            }
                            jsonData = buffer.toString();
                        }
                    }
                }
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
            return jsonData;
        }
    }
}

用您的Wordpress网站的URL替换 WORDPRESS_SITE_URL

用于保存Wordpress发布数据的POJO类:

public class WordpressPost {
    private final String title;
    private final String content;

    WordpressPost(String title, String content) {
        this.title = title;
        this.content = content;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }
}

MainActivity布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp"/>

</android.support.constraint.ConstraintLayout>