天候という知識に基づいて気象情報を取得するためのAndroidのAPI


なぜ私たちは、テキスト部分の説明の多くが表示されますので、JSONについての知識を統合するために、主に、このブログを書き、もちろん、最終的なコードは、私はこの点を心配しないで掲示、あなたは説明が達成するために省略することができます見たくありませんセクション、あなたはまた、ソースをダウンロードすることができます 無料

JSON

JSONの紹介

JSON(JavaScript Object Notation)は軽量のデータ交換フォーマットです。読みと書きやすいです。マシンが解析し、生成することは簡単です。それは言語、標準ECMA-262のプログラミングはJavaScriptに基づいている月-第3版1999サブセットを。話す「であるJSONは配列/オブジェクトの特定の順序があります。」

JSONオブジェクト

JSONオブジェクト属性が複数であることを特徴と{} JSONオブジェクトの下にある、同封。
{
"エリア": "北京海淀"、
"名": "李Dazui"、
"年齢":25
}

JSON配列

JSON配列が実際にJSONのコレクション内の複数のオブジェクトを含み、アレイは、アレイのブラケットである[]囲まれ、JSON配列である見ることができる同じJSONオブジェクト組成物。我々はそれを呼び出すことができ、典型的な JSONアレイの
[{
「エリア」:「広東省」、
「名前」:「ブラザーキジ」、
「年齢」:25
}、{
「エリア」:「広西」、
「名前」: "ブーブー"、
"年齢":26である
}]
典型的なJSON配列と、そこに確かに非定型JSON配列
[{
"エリア": "江蘇省"、
"名前": "徐州"、
"年齢":25
}、 {
"市" "江蘇省"、
"天気": "クリア"、
}]

JSONの構文解析

ジャクソン、FastJSON:多くの方法があるJSONの解析、公式にはJSONObect解析、GoogleのオープンソースライブラリGSONである、のようないくつかのサードパーティ製のオープンソースライブラリがあります。私はここで選択した公式JSONObjectが解決のために提供されます。具体的な実装が実現し、後のセクションで詳細に入ります。

Androidの天気を取得します

天候を取得するプロセス

1:無料の天気API(天候を知る心)を見つける
JSONデータ取得のアクセスAPI(APIキーが必要)、2:
気象情報を取得するためにJSONデータを解析:3

天気APIキーを知って心をゲット

まずログインが天候の公式ウェブサイトことを知っていた、もちろん、あなたが以下のようにログイン後、登録する必要ここに画像を挿入説明
の右上にクリックしてログインした後、コンソールの下に示すように、
ここに画像を挿入説明
選択するために、製品管理を下に追加の製品選択し、無料あなたがお金を持っている場合、当然のを、選択デベロッパーEditionまたはEnterprise Editionのも可能です。バック製品のインターフェイスに、あなたは我々が得ることがわかります次に公開鍵を秘密鍵は非常に重要であるが、我々がアクセス権を持っていない、公開鍵は十分です、私は何の関係も、キーが追加されていません。ここに画像を挿入説明

天気APIを知って心をゲット

クリックしてAPIドキュメントを、あなたは見ることができますAPIの例と説明はここでは、直接ゴールを私に天気をダウン知っていました。最初の行は、私たちが得ることKEYが後ろを埋めるために、注意を払うが、それを説明するために必要であるべきであるAPIのパラメータの説明の例を、以下、APIの一例であるAPIの公開鍵
ここに画像を挿入説明
我々はアクセス次の例に、このAPI、あなたが参照できることを検索ボックスは、それが得ることができるものを見るために上の画像の例である
ここに画像を挿入説明
これは何?そのJSONデータはありませんか?私たちは、一般などの都市、天気、言語に関する情報が含まれているかを確認することができ、そして私たちの仕事は、普通の人が情報を理解することができる方法に出てくるJSONデータを解析することです。

コードセクション

私たちがOKhttp閉鎖を追加するために、APIへのアクセスに使用OKhttp、build.Gradleに依存関係を{}次のコードを追加添加を同期するために覚えた後のGradleをファイル

 implementation 'com.squareup.okhttp3:okhttp:3.4.1'

AndroidMainfest.xml
行権限(パーミッションがネットワークを適用)を追加

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

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<Button
    android:id="@+id/send_request"
    android:text="Send_request"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
    <TextView
        android:hint="原始JSON数据"
        android:id="@+id/response"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
  <EditText
      android:hint="city"
      android:id="@+id/City"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>
    <EditText
        android:hint="weather"
        android:id="@+id/Weather"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <EditText
        android:hint="temperature"
        android:id="@+id/Temperature"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

MainActivity.xml

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView responseText;
    private EditText weather;
    private EditText city;
    private EditText temperature;
    private String Weather;
    private String CityName;
    private String Tempeature;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button sendRequest = (Button) findViewById(R.id.send_request);
        responseText = (TextView) findViewById(R.id.response);
        weather = (EditText) findViewById(R.id.Weather);
        city = (EditText) findViewById(R.id.City);
        temperature = (EditText) findViewById(R.id.Temperature);
        sendRequest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.send_request) {
            sendRequestWithOkHttp();
        }
    }

    private void sendRequestWithOkHttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();//创建一个OkHttp实例
                    Request request = new Request.Builder().url("https://api.seniverse.com/v3/weather/now.json?key=SrvH71t8JeTOXNLJP&location=beijing&language=zh-Hans&unit=c").build();//创建Request对象发起请求,记得替换成你自己的key
                    Response response = client.newCall(request).execute();//创建call对象并调用execute获取返回的数据
                    String responseData = response.body().string();
                    showResPonse(responseData);//显示原始数据和解析后的数据
                    parseJSONWithJSONObject(responseData);//解析SSON数据
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseJSONWithJSONObject(String jsonData) {//用JSONObect解析JSON数据
        try {
            JSONObject jsonObject = new JSONObject(jsonData);  
            JSONArray results = jsonObject.getJSONArray("results");   //得到键为results的JSONArray
            JSONObject now = results.getJSONObject(0).getJSONObject("now");//得到键值为"now"的JSONObject
            JSONObject location = results.getJSONObject(0).getJSONObject("location");   //得到键值为location的JSONObject
            Weather = now.getString("text");//得到"now"键值的JSONObject下的"text"属性,即天气信息
            CityName = location.getString("name");  //获得城市名
            Tempeature = now.getString("temperature"); //获取温度
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void showResPonse(final String response) {
        runOnUiThread(new Runnable() {//切换到主线程,ui界面的更改不能出现在子线程,否则app会崩溃
            @Override
            public void run() {
                responseText.setText(response);
                city.setText(CityName);
                weather.setText(Weather);
                temperature.setText(Tempeature);
            }
        });
    }
}

次のような結果を達成するために

私は唯一の3つの都市間の天気、気温や情報を解決し、厳格に難しいことではありません適用される他、

高度な - 任意の都市の天気情報を取得します。

私は都市の天気のいずれかを取得したい場合は、どのようにそれを達成するには?実際には非常に単純な限り、場所のAPIのアドレスの値を入力することができる値に変更することができますよう。私は、書き込みにあまりにも多くのコードを繰り返す必要はありません、私は意志あなたの参考のために、一緒にソースコードをアップロードします。結果を達成するため、次のようです。

公開された13元の記事 ウォンの賞賛8 ビュー3200

おすすめ

転載: blog.csdn.net/It_is_IT_/article/details/105354521