如何使用 Retrofit 从 Json 数组列表中检索 MpAndroid 图表内的数据?

Posted

技术标签:

【中文标题】如何使用 Retrofit 从 Json 数组列表中检索 MpAndroid 图表内的数据?【英文标题】:How to retrieve data inside a MpAndroid chart from Json array list using Retrofit? 【发布时间】:2020-02-01 18:43:44 【问题描述】:

这是我从服务器收到的 Json 响应:


    "OpdIpdComparison": [
        
            "Year": 2019,
            "Month": 1,
            "MonthString": "January",
            "IPD": 35,
            "OPD": 3,
            "Percent": "12.0"
        ,
        
            "Year": 2019,
            "Month": 2,
            "MonthString": "February",
            "IPD": 40,
            "OPD": 0,
            "Percent": "Infinity"
        ,
        
            "Year": 2019,
            "Month": 3,
            "MonthString": "March",
            "IPD": 53,
            "OPD": 0,
            "Percent": "Infinity"
        ,
        
            "Year": 2019,
            "Month": 4,
            "MonthString": "April",
            "IPD": 47,
            "OPD": 0,
            "Percent": "Infinity"
        
      ]

这是我的模型类:

公共类 OpdIpdModel

@Json(name= "Year")
private Integer year;

@Json(name= "Month")
private Integer month;


@Json(name= "MonthString")
private String monthString;

@Json(name= "IPD")
private Integer iPD;

@Json(name= "OPD")
private Integer oPD;

@Json(name= "Percent")
private String percent;

public OpdIpdModel() 


public OpdIpdModel(Integer year, Integer month, String monthString, Integer iPD, Integer oPD, String percent) 
    this.year = year;
    this.month = month;
    this.monthString = monthString;
    this.iPD = iPD;
    this.oPD = oPD;
    this.percent = percent;


public Integer getYear() 
    return year;


public void setYear(Integer year) 
    this.year = year;


public Integer getMonth() 
    return month;


public void setMonth(Integer month) 
    this.month = month;


public String getMonthString() 
    return monthString;


public void setMonthString(String monthString) 
    this.monthString = monthString;


public Integer getiPD() 
    return iPD;


public void setiPD(Integer iPD) 
    this.iPD = iPD;


public Integer getoPD() 
    return oPD;


public void setoPD(Integer oPD) 
    this.oPD = oPD;


public String getPercent() 
    return percent;


public void setPercent(String percent) 
    this.percent = percent;

API 服务类:

public interface ApiService 

    @GET("/Report/GetOpdIpdComparison?departmentId=473")
    Call<ModelResponse> getAllOpdIpdData();

ModelResponse 类

public class ModelResponse 

    //@SerializedName("OpdIpdComparison") //for gson converter
    @Json(name = "OpdIpdComparison") //for moshi converter
    private List<OpdIpdModel> OpdIpdComparison;

    public ModelResponse(List<OpdIpdModel> opdIpdComparison) 
        OpdIpdComparison = opdIpdComparison;
    

    public List<OpdIpdModel> getOpdIpdComparison() 
        return OpdIpdComparison;
    

    public void setOpdIpdComparison(List<OpdIpdModel> opdIpdComparison) 
        OpdIpdComparison = opdIpdComparison;
    

检索 Jason 数据的主类:

    public class OpdIpdAnalysis extends AppCompatActivity

    ApiService service;
    TokenManager tokenManager;
    Call<ModelResponse> call;

    private ListView mListView;

     //GraphView
    private BarChart mBarChart;

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

        mListView = findViewById(R.id.mListView);

        //GraphView casting
        mBarChart = (BarChart)findViewById(R.id.barChart);

            //code for retrofit call

               Call<List<OpdIpdModel>> call2 = service2.getGraphData();
        call2.enqueue(new Callback<List<OpdIpdModel>>() 
            @Override
            public void onResponse(Call<List<OpdIpdModel>> call, Response<List<OpdIpdModel>> response) 

                if (response.body() != null)
                    List<BarEntry> barEntries = new ArrayList<>();

                    for (OpdIpdModel opdIpdModel : response.body().getOpdIpdComparison())

                        barEntries.add(new BarEntry(opdIpdModel.getoPD(), opdIpdModel.getiPD()));
                    

                    BarDataSet barDataSet = new BarDataSet(barEntries, "");
                    barDataSet.setColors(ColorTemplate.COLORFUL_COLORS);

                    BarData barData = new BarData();
                    barData.setBarWidth(0.9f);

                    mBarChart.setVisibility(View.VISIBLE);
                    mBarChart.animateY(4000);
                    mBarChart.setData(barData);
                    mBarChart.setFitBars(true);

                    Description description = new Description();
                    description.setText("Growth rate per month");
                
            

            @Override
            public void onFailure(Call<List<OpdIpdModel>> call, Throwable t) 
                myProgressBar.setVisibility(View.GONE);

                Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Network Status: " + t.getMessage(), Snackbar.LENGTH_LONG);
                View snackbarView = snackbar.getView();
                snackbarView.setBackgroundColor(Color.parseColor("#e64a19"));
                TextView tv = (TextView) snackbarView.findViewById(R.id.snackbar_text);
                tv.setTextColor(Color.WHITE);
                snackbar.show();
            
        );


现在,当我启动我的应用程序时,它工作正常,但数据未显示 图视图。我该如何解决这个问题

我的布局没有问题。

提前致谢。

【问题讨论】:

您遇到的错误是什么?您的应用在哪一行崩溃? @Yserbius 应用程序现在工作正常,因为我根据 akshay_shahane 更新了我的代码,但问题是在 graphView 中没有显示任何内容,它是空白的。不知道为什么!! 您是否仍然面临或解决这个问题? 问题已解决,但我在 xAxis 上的标签仍有一些问题 【参考方案1】:

您正在尝试循环 response.body() 这是 json 对象而不是数组

改成

            for (OpdIpdModel opdIpdModel : response.body().getOpdIpdComparison())

【讨论】:

以上是关于如何使用 Retrofit 从 Json 数组列表中检索 MpAndroid 图表内的数据?的主要内容,如果未能解决你的问题,请参考以下文章

当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?

如何使用 Retrofit 和 Jackson 读取嵌套的 JSON 数组?

如何使用 Gson 和 Retrofit 将类似的 Json 对象转换为 Json 数组

如何使用 Retrofit 2 处理动态 JSON?

如何使用 Retrofit 查询过滤器 json

如何使用 gson/retrofit 获取对象数组?