Cannot fetch array values from API

0

I'm new to API data fetching and I have used this ThingSpeak API library for Android. to get JSON data from a Thingspeak URL to my Java Android application.

The JSON data looks like this

{"channel":

        {"id":1382053,"name":"WeightScale","latitude":"0.0","longitude":"0.0","field1":"weight",
        "created_at":"2021-05-06T05:18:16Z","updated_at":"2021-05-06T05:18:16Z","last_entry_id":207},
        
    "feeds":
        [
            {"created_at":"2021-05-07T16:26:06Z","entry_id":206,"field1":"0.00000"},
            {"created_at":"2021-05-07T16:26:22Z","entry_id":207,"field1":"2.00000"}
        ]
}

and my MainActivity contains

package com.dommy.qrcodelib;


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.macroyau.thingspeakandroid.ThingSpeakChannel;
import com.macroyau.thingspeakandroid.model.ChannelFeed;

import java.util.Date;


public class MainActivity extends AppCompatActivity {

    private ThingSpeakChannel tsChannel;

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

    public void fetchData() {
        tsChannel = new ThingSpeakChannel(1382053,"[MyAPIKey]");
        // Set listener for Channel feed update events
        tsChannel.setChannelFeedUpdateListener(new ThingSpeakChannel.ChannelFeedUpdateListener() {
            @Override
            public void onChannelFeedUpdated(long channelId, String channelName, ChannelFeed channelFeed) {
               
                long entry = channelFeed.getChannel().getLastEntryId();
                Log.e(null,""+ entry); 
                Date lastUpdate = channelFeed.getChannel().getUpdatedAt();
                Toast.makeText(MainActivity.this, lastUpdate.toString(), Toast.LENGTH_LONG).show();
                
                //unable to get last data value from here onwards (instead prints lots of entries) 
                
                 String d = channelFeed.getFeeds().toString();
                 Log.e(null,""+ d); 
            }
        });
        
        tsChannel.loadChannelFeed();

    }
}

I need to print a log with the last field1 value that was received. (eg: 2.00000 needs to be printed)

The current code only prints an output similar to:

E/dommy.qrcodeli: [com.macroyau.thingspeakandroid.model.Feed@90c638d, com.macroyau.thingspeakandroid.model.Feed@ca98942, com.macroyau.thingspeakandroid.model.Feed@70dbd53, com.macroyau.thingspeakandroid.model.Feed@1bb1690, com.macroyau.thingspeakandroid.model.Feed@e8ab89, com.macroyau.thingspeakandroid.model.Feed@c4af78e, com.macroyau.thingspeakandroid.model.Feed@92cdbaf, com.macroyau.thingspeakandroid.model.Feed@b630bbc, com.macroyau.thingspeakandroid.model.Feed@6277745, com.macroyau.thingspeakandroid.model.Feed@982fe9a, com.macroyau.thingspeakandroid.model.Feed@b7583cb, com.macroyau.thingspeakandroid.model.Feed@93327a8, com.macroyau.thingspeakandroid.model.Feed@4cd42c1, com.macroyau.thingspeakandroid.model.Feed@8026a66, com.macroyau.thingspeakandroid.model.Feed@65691a7, com.macroyau.thingspeakandroid.model.Feed@1671654, com.macroyau.thingspeakandroid.model.Feed@aaa49fd, com.macroyau.thingspeakandroid.model.Feed@3bac6f2, com.macroyau.thingspeakandroid.model.Feed@50a143, com.macroyau.thingspeakandroid.model.Feed@4943c0, com.macroyau.thingspeakandroid.model.Feed@85688f9, com.macroyau.thingspeakandroid.model.Feed@42a603e, com.macroyau.thingspeakandroid.model.Feed@d520e9f, com.macroyau.thingspeakandroid.model.Feed@a5edbec, com.macroyau.thingspeakandroid.model.Feed@5edbbb5, com.macroyau.thingspeakandroid.model.Feed@868424a, com.macroyau.thingspeakandroid.model.Feed@7d2f5bb, com.macroyau.thingspeakandroid.model.Feed@553cad8, com.macroyau.thingspeakandroid.model.Feed@78b5e31, com.macroyau.thingspeakandroid.model.Feed@7f03916, com.macroyau.thingspeakandroid.model.Feed@fb13297, com.macroyau.thingspeakandroid.model.Feed@3a6bc84, com.macroyau.thingspeakandroid.model.Feed@d86ac6d, com.macroyau.thingspeakandroid.model.Feed@42ed0a2, com.macroyau.thingspeakandroid.model.Feed@acc6133, com.macroyau.thingspeakandroid.model.Feed@f151cf0, com.macroyau.thingspeakandroid.model.Feed@c6ea269, com.macroyau.thingspeakandroid.model.Feed@6cd54ee, com.macroyau.thingspeakandroid.model.Feed@361dd8f, com.macroyau.thingspeakandroid.model.Feed@dc7181c, com.macroyau.thingspeakandroid.model.Feed@8c5fc25, com.macroyau.thingspeakandroid.model.Feed@8bdd1fa, com.macroyau.thingspeakandroid.model.Feed@28c3ab, com.macroyau.thingspeakandroid.model.Feed@e3b9a08, com.macroyau.thingspeakandroid.model.Feed@27f35a1, com.macroyau.thingspeakandroid.model.Feed@e0713c6, com.macroyau.thingspeakandroid.model.Feed@22def87, com.macroyau.thingspeakandroid.model.Feed@5f44eb4, com.macroyau.thingspeakandroid.model.Feed@c388add, com.macroyau.thingspeakandroid.model.Feed@250a652, com.macroyau.thingspeakandroid.model.Feed@46ffd23, com.macroyau.thingspeakandroid.model.Feed@ee1a220, com.macroyau.thingspeakandroid.model.Feed@a37f7d9, com.macroyau.thingspeakandroid.model.Feed@22ed59e, com.macroyau.thingspeakandroid.model.Feed@93b487f, com.macroyau.thingspeakandroid.model.Feed@f8ec04c, com.macroyau.thingspeakandroid.model.Feed@5273895, com.macroyau.thingspeakandroid.model.Feed@d2eadaa, com.macroyau.thingspeakandroid.model.Feed@145ed9b, com.macroyau.thingspeakandroid.model.Feed@a0d9538, com.macroyau.thingspeakandroid.model.Feed@c8fc911, com.macroyau.thingspeakandroid.model.Feed@ca1fa76, com.macroyau.thingspeakandroid.model.Feed@88bc877, com.macroyau.thingspeakandroid.model.Feed@da2cce4, com.macroyau.thingspeakandroid.model.Feed@516e54d, com.macroyau.thingspeakandroid.model.Feed@b2b4802, com.macroyau.thingspeakandroid.model.Feed@4ea7513, com.macroyau.thingspeakandroid.model.Feed@731d350, com.macroyau.thingspeakandroid.model.Feed@e798949, com.macroyau.thingspeakandroid.model.Feed@909e24e, com.macroyau.thingspeakandroid.model.Feed@27d4f6f, com.macroyau.thingspeakandroid.model.Feed@c68d47c, com.macroyau.thingspeakandroid.model.Feed@d487105, com.macroyau.thingspeakandroid.model.Feed@925d55a, com.macroyau.thingspeakandroid.model.Feed@9b9738b, com.macroyau.thingspeakandroid.model.Feed@dacbc68, com.macroyau.thingspeakandroid.model.Feed@4641881, com.macroyau.thingspeakandroid.model.Feed@2dbed26, com.macroyau.thingspeakandroid.model.Feed@b49bd67, com.macroyau.thingspeakan
D/CompatibilityChangeReporter: Compat change id reported: 147798919; UID 10000; state: DISABLED
E/dommy.qrcodeli: Invalid ID 0x00000000.
 
java
android
asked on Stack Overflow May 8, 2021 by Denver Shenal

2 Answers

1

Your code represents a JSON Array and not a JSON Object.

getFeeds() must return a list of Feed objects. Find the last Feed object based on the lastEntryId and which gives you a feedObject. Now you can print the feedObject.field1 value.

This is a pseudo-code in Kotlin for help.

val feedList = channelFeed.getFeeds()
val feed = feedList.find { it.entryId == lastEntryId }
Log.d("TAG", "Value is " + feed.field1)
answered on Stack Overflow May 8, 2021 by Mohit Ajwani
1

Problem: Here you are getting a string representation of your object means every class in java is a child of the Object class either directly or indirectly. Object class contains toString() method. We can use the toString() method to get a string representation of an object. Whenever we try to print the Object reference then internally toString() method is invoked.

Solution: In your Pojo or Model class you have to override the toString, hashCode and equals method to get the real value of your objects.

Example:-

    public class Person {
   private String name;
   private int age = 0;

   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;

       Person person = (Person) o;

       if (name != null ? !name.equals(person.name) : person.name != null) return false;
       if (age != 0 ? age != person.age : person.age != 0) return false;
   }

   @Override
   public int hashCode() {
       int result = name != null ? name.hashCode() : 0;
       result = 31 * result + age;
       return result;
   }

   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               ", age='" + age + '\'' +
               '}';
   }
}
answered on Stack Overflow May 8, 2021 by Nitin Prakash

User contributions licensed under CC BY-SA 3.0