【问题标题】:Getting JSON Data on Table on JSTL Page在 JSTL 页面上的表上获取 JSON 数据
【发布时间】:2019-08-04 19:15:46
【问题描述】:

所以我使用 amiibo api 来提取数据,并在表格中显示返回的内容。现在,我只是将这个系列放在表中以确保它有效,但它没有!

这是我的桌子:

<table class="table table-striped table-hover table-sm">
            <thead>
                <tr>
                    <th class="col-sm-1" scope="col">#</th>
                    <th class="col-sm-11" scope="col">Amiibo</th>
                </tr>
            </thead>
            <c:forEach var="amiibo" items="${amiibos}" varStatus="status">
                <tr>
                    <th scope="row">${status.count}</th>
                    <td>${amiibo.amiiboSeries}</td>
                </tr>
            </c:forEach> 
        </table>

这是我的 servlet,它提取 api 数据并将其放入列表中:

String json = callAmiiboApi(input.getAmiibo());

        // Check for valid json format.  If false, String contains an error message.
        if (json.startsWith("{") || json.startsWith("[")) {
            Gson gson = new Gson();
            ArrayList<Amiibo> amiibos = gson.fromJson(json, new TypeToken<ArrayList<Amiibo>>(){}.getType());

            //get list of elements 
            if (!amiibos.isEmpty() && amiibos.size() > 0) {
                request.setAttribute("amiibos", amiibos);
            }  
        }

这是我的对象:

public class Amiibo implements Serializable
{
    public String amiiboSeries;
    public String character;
    public String gameSeries;
    public String head;
    public String image;
    public String name;
    public String[] release;
    public String tail;
    public String type;

    public Amiibo()
    {
        amiiboSeries = "";
        character = "";
        gameSeries = "";
        head = "";
        image = "";
        name = "";
        release = new String[0];
        tail = "";
        type = "";
    }

    public String getAmiiboSeries()
    {
        return amiiboSeries;
    }

这是我得到的错误:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

有谁知道我在提取这些数据时做错了什么?我认为 api 可以正常访问,我相信我的问题在于我如何显示它(可能当我将它放入列表时?)。

-- 编辑--

这是我获取用户输入的输入类

import java.io.Serializable;

public class Input implements Serializable {
    private String amiibo;

    public Input() {
        this("");
    }

    public Input(String amiibo) {
        this.amiibo = amiibo;
    }

    public String getAmiibo() {
        return amiibo;
    }

    public void setAmiibo(String amiibo) {
        this.amiibo = amiibo;
    }  
}

【问题讨论】:

  • 您能否展示您在抛出异常时使用的JSON 有效负载?当JSON{ 开始时,您不能使用List
  • 不好意思,不知道你说的json payload是什么意思?
  • json String 长得怎么样?
  • 以下是显示 json 外观的文档:amiiboapi.com/docs

标签: java json api servlets jstl


【解决方案1】:

克里特包装对象:

class AmiiboResponse {

    private List<Amiibo> amiibo;

    public List<Amiibo> getAmiibo() {
        return amiibo;
    }

    public void setAmiibo(List<Amiibo> amiibo) {
        this.amiibo = amiibo;
    }
}

并以这种方式反序列化:

List<Amiibo> amiibos = gson.fromJson(json, AmiiboResponse.class).getAmiibo();

【讨论】:

  • 谢谢!所以我想我已经有了与你的建议类似的东西。我已编辑我的问题以添加相关课程。
  • @burgoyne,你的班级,如果你发送给REST API的输入。 AmiiboResponse 类应该用于反序列化来自 REST API 的输出。
  • 在尝试您的解决方案时出现此错误:java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 241 path $.amiibo[0].release
  • @burgoyne,这是因为在你的模型中你有public String[] release; 但它应该是public Map&lt;String, String&gt; release; 这是文档中的一个对象,所以你应该在这里使用Map
  • 做到了。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2014-02-18
  • 2017-06-04
  • 2019-06-13
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多