如何使用用户输入打开api JSON [重复]

Posted

技术标签:

【中文标题】如何使用用户输入打开api JSON [重复]【英文标题】:How to use user input to open api JSON [duplicate] 【发布时间】:2020-02-22 18:30:35 【问题描述】:

我正在开发一个 android 应用程序,我正在其中制作一个天气应用程序。应用程序从 JSON 打开 api 数据并显示此信息。更具体地说,它接受用户输入的城市或邮政编码,并将此信息添加到 API 的 URL,然后执行 URL。

MainActivity.java

package com.shanehampcsci3660.weather;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

//import static com.shanehampcsci3660.weather.GetJsonData.*;

public class MainActivity extends AppCompatActivity

    public static TextView tempTV, jsonTV;
    public EditText cityORZipET;
    private Button getWeather;
    public String zip, cityOrZip;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tempTV = (TextView) findViewById(R.id.tempTV);
        jsonTV = (TextView) findViewById(R.id.jsonFeedTV);

        cityORZipET = (EditText) findViewById(R.id.cityORZipET);

        getWeather = (Button) findViewById(R.id.getWeatherButton);
        //cityOrZip = cityORZipET.getText().toString();

        getWeather.setOnClickListener(new View.OnClickListener()
        
            @Override
            public void onClick(View view)
            

                GetJsonData getJsonData = new GetJsonData();
                //getJsonData.execute();
                cityOrZip = cityORZipET.getText().toString();
                getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + cityOrZip +"&appid=x");
                jsonTV.setText(cityOrZip);

                /*if(cityOrZip.equals(""))
                
                    getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + cityOrZip +"&appid=x");

                
                else
                
                    zip = "30528";
                    getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + zip + "&appid=x");
                */


            
        );

    


GetJsonData.java

package com.shanehampcsci3660.weather;

import android.os.AsyncTask;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class GetJsonData extends AsyncTask<Void, Void, Void>



    public String data= "", line = "", name = "";
    double temp, minTemp, maxTemp;




    @Override
    protected Void doInBackground(Void... voids)
    
        try
        
            URL url = new URL("https://api.openweathermap.org/data/2.5/weather?q=30528&appid=id");

            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            while(line != null)
            
                line = bufferedReader.readLine();
                data = data + line;
            

            JSONObject jsonObject = new JSONObject(data);
            JSONObject main = jsonObject.getJSONObject("main");

            name = jsonObject.getString("name");
            temp = main.getDouble("temp");
            minTemp = main.getDouble("min_temp");
            maxTemp = main.getDouble("max_temp");

            /*JSONObject jsonObject = new JSONObject(result);
            JSONObject jsonData = new JSONObject(jsonObject.getString("main"));
            String weatherInfo = jsonObject.getString("weather");
            JSONArray jsonArray = new JSONArray(weatherInfo);
            String description, icon, iconURI;
            for(int i = 0; i < jsonArray.length(); i++)
            
                JSONObject jsonData1 = jsonArray.getJSONObject(i);
                description = jsonData1.getString("description");
                MainActivityController.description.setText(description);
                icon = jsonData1.getString("icon");
                iconURI = "http://openweathermap.org/img/w/" + icon + ".png";
                Picasso.get().load(iconURI).into(MainActivityController.conditionImageView);
            */

        
        catch(MalformedURLException e)
        
            e.printStackTrace();
        
        catch(IOException e)
        
            e.printStackTrace();
        
        catch (JSONException e)
        
            e.printStackTrace();
        


        return null;
    

    @Override
    protected void onPostExecute(Void aVoid)
    
        super.onPostExecute(aVoid);

        //MainActivity.jsonTV.setText(data);
        MainActivity.tempTV.setText("City:\t" + name + "\tTemp:\t" + temp);

        Log.d("Json Feed", name + "Temp: " + temp);
    

    public static void execute(String s) 
    

我的问题是,无论我放在哪里......

if(cityOrZip.equals(""))
                    
                        getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + cityOrZip +"&appid=id");

                    
                    else
                    
                        zip = "30528";
                        getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + zip + "&appid=id");
                    

...它只会显示在GetJsonData.java中打开的默认Url的数据。我的问题是我做错了什么,我应该纠正什么,以使我的应用能够正常使用用户输入。

【问题讨论】:

我建议使用 Volley 而不是 AsyncTask。并且永远不要在 Activity 中使用静态视图 我刚刚开始学习android studio并这样做。我从来没有学过排球 Android 文档中有关于它的指南。还有很多其他方法可以进行 http 调用来避免 AsyncTask 的问题 【参考方案1】:

您正在使用包含客户端数据的 url 调用 GetJsonData.execute,但其中没有代码。查看您当前的代码,客户端输入的 zip 不会存储到工作人员类中。

【讨论】:

那么你建议我做什么来解决它 不知道...实现它,也许?【参考方案2】:

这是因为您总是在 GetJsonData 类中使用相同的 URL。根据问题What arguments are passed into AsyncTask?,您的类声明应如下所示:

public class GetJsonData extends AsyncTask<String, Void, YourPojo> 

    @Override
    protected YourPojo doInBackground(String... urls)
    
        try
        
            URL url = new URL(urls[0]);
            ...
         catch (Exception e) 
           handle(e);
        
   

其中YourPojo 是您需要创建的一个类,用于存储您需要从JSON 有效负载中读取的所有属性:

class YourPojo 
    private String data;
    private String line;
    private String name;
    private double temp;
    private double minTemp
    private double maxTemp;

    // getters, setters

【讨论】:

以上是关于如何使用用户输入打开api JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 POST json 中获取数据

如何使用 JSON 用户 API 中的 POST 将密码值传递给 wordpress

json 如何使用Chrome Identity API为Chrome扩展程序设置用户身份验证

使用 swift 3 访问 JSON 中的值

如何从rails中的api更新用户模型?

群晖如何批量建立用户