如何以JSON格式下载WordPress数据



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

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

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

我认为在JSON中检索Wordpress数据的一个很好的解决方案是使用REST API。使用 API,您将能够检索帖子、类别、标签、评论等。全部采用 JSON 格式,您可以在其中解析它。

您可以在 REST API

手册中查看 REST API 参考

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_SITE_URL替换为您的 Wordpress 网站的 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;
    }
}

主活动布局文件:

<?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>

最新更新