Java 从其他静态类获取json对象的值

Java 从其他静态类获取json对象的值,java,android,json,static,Java,Android,Json,Static,嗨,我的android项目是 提供纬度和经度的GPSTracker.java类 从adress API获取JSON的RemoteFetch.java类处于静态 MainActivity.java 但获取json的url如下所示: 私有静态最终字符串打开\天气\地图\ API= “?“+”q=%s&“+”lat=“+”&lon=“+”&units=metric” 我的纬度和经度在GPSTracker中,但当我获取它们时,它不允许我获取这些值,因为它们不是静态格式 因此,一旦我将它们添加到我的o

嗨,我的android项目是

  • 提供纬度和经度的GPSTracker.java类
  • 从adress API获取JSON的RemoteFetch.java类处于静态
  • MainActivity.java 但获取json的url如下所示:

    私有静态最终字符串打开\天气\地图\ API= “?“+”q=%s&“+”lat=“+”&lon=“+”&units=metric”

我的纬度和经度在GPSTracker中,但当我获取它们时,它不允许我获取这些值,因为它们不是静态格式

因此,一旦我将它们添加到我的openweatherapi url中,我就会出现错误:

“无法从静态上下文引用非静态字段”

有没有办法将字符串/整型格式转换为静态格式

如果你需要更多的信息,请告诉我

这里有一些代码

private void updateWeatherData(final String city){
        new Thread(){
            public void run(){

                final  JSONObject json = RemoteFetch.getJSON(MainActivity.this,city);
                if(json == null){
                    handler.post(new Runnable(){
                        public void run(){
                          Toast.makeText(MainActivity.this.getApplicationContext(),R.string.place_not_found,Toast.LENGTH_LONG).show();
                        }
                    });
                } else {
                    handler.post(new Runnable(){
                        public void run(){
                            renderWeather(json);
                        }
                    });
                }
            }
        }.start();
    }
在RemoteFetch.java中

 private static final String OPEN_WEATHER_MAP_API =
            "http://api.openweathermap.org/data/2.5/weather?" + "q=%s&" +"lat="+"&lon=" + "&units=metric";
    public static JSONObject getJSON(Context context, String city){
        try {
          //  gps.getLatitude();
            URL url = new URL(String.format(OPEN_WEATHER_MAP_API, city));
            HttpURLConnection connection =
                    (HttpURLConnection)url.openConnection();

            connection.addRequestProperty("x-api-key", 
                    context.getString(R.string.open_weather_maps_app_id));

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));

            StringBuffer json = new StringBuffer(1024);
            String tmp="";
            while((tmp=reader.readLine())!=null)
                json.append(tmp).append("\n");
            reader.close();


            JSONObject data = new JSONObject(json.toString());

您试图访问的内容不在您的范围内(也称为上下文,但就语言而言,不要将其与类上下文混淆)。因此,您要么需要将变量作为参数传递给静态方法,要么创建方法和实例方法(删除静态变量)

编辑以作进一步解释:

在代码的某个部分(我想不是在粘贴的部分),您使用的是一个属性。在静态方法中,您无法看到该属性。 “静态”意味着不管它是什么,它都存在于类中,而非静态的东西属于该类的实例。虽然编写代码时代码似乎位于同一位置,但在运行时它不会位于同一位置。这就是为什么在静态上下文(即静态方法内部)上执行操作时,无法从实例中看到属性

所以你要么:

  • 将其作为参数传递,就像对其他两个(上下文和城市)所做的一样

  • 或者从toJSON方法中删除“static”关键字。如果它在静态上下文的其他地方使用,请小心,因为它可能会抛出一个编译错误,说明现在其他上下文无法看到该方法

另外,您可能想查看Gson

如果您对错误有任何反应,请阅读并尝试了解其工作原理:

还有一些关于班级成员的文件


我建议您回顾一下基本的OOP概念,因为您遇到的这个错误是一个非常基本的错误。

您必须理解类和该类实例之间的区别。静态字段和方法连接到类本身,而不是它的实例

因为根据您的代码,
纬度和经度在GPSTracker中,
不是静态的(这些是实例变量),所以您得到了错误

要解决您的问题,您需要实例化类的实例(创建对象),以便运行时可以为实例保留内存,并允许您访问实例变量(在您的情况下,
纬度和经度在GPSTracker

在下面的代码中尝试访问GPSTracker中的
纬度和经度
(例如在MainActivity的
onCreate()
中)

GPSTracker obj=新的GPSTracker()

要访问实例变量纬度和经度,请使用下面的
obj
obj.纬度
obj.经度

以上2点其他工作要考虑:
BR> 1.如果GPSTracker类不在文件包内,请确保将其导入文件中要使用的位置(例如mainacitity.java)。


2.如果GPSTracker类定义了一些其他的构造函数,您需要使用这些构造函数来创建一个对象。

谢谢您的回答,我真的不知道怎么做,获取json的方法是这样的:public static JSONObject getJSON(Context Context,String city){try{URL URL=newurl(String.format(OPEN_WEATHER_MAP_API,city));因此,我必须在String city之后添加一些东西,比如double latitude?如果我删除了static,我就有了“Non static method”getJSON。。。“无法从静态上下文引用我编辑了我的响应,并提供了更详细的解释和链接扫描您是否将GPSTracker类get coordinates方法更改为静态?在RemoteFetch.java中提供纬度和经度的唯一方法是将GPSTracker GPSTracker=new GPSTracker(此);在onCreate中,但由于RemoteFetch不是一个活动……不管怎样,我需要一种方法能够将这些值(现在我已经得到它们)赋给json api url,因为只要我将“+纬度”添加到json url中,我就会得到“非静态字段无法从静态上下文引用”但是我不能使getJSON方法成为非静态的,因为我将得到以下错误:“错误:(147,53)错误:非静态方法getJSON(上下文,字符串)不能从静态上下文中引用”,在“final JSONObject json=RemoteFetch.getJSON(MainActivity.this,city);“这来自我的MainActivity.java