You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ember.js中渲染Java Servlet返回的全部JSON数组数据

解决Ember.js渲染Java Servlet返回的JSON数据问题

核心问题分析

你的Java Servlet当前返回的是多行独立的JSON对象,不符合标准JSON数组格式,导致jQuery解析后得到的是带数字索引键的对象(而非真正的数组);同时Handlebars模板使用{{#each-in}}遍历整个对象,无法正确渲染多行数据。


解决方案步骤

1. 修正服务器返回的JSON格式(推荐)

将Servlet返回内容修改为标准JSON数组,用[]包裹所有对象,对象间用逗号分隔:

[
  {"CAPACITY":"4","PRICE":"918","RTYPE":"basic","ID":"4"},
  {"CAPACITY":"2","PRICE":"885","RTYPE":"villa","ID":"8"},
  {"CAPACITY":"2","PRICE":"1579","RTYPE":"villa","ID":"5"},
  {"CAPACITY":"1","PRICE":"1526","RTYPE":"villa","ID":"1"}
]

2. 修改Ember控制器代码

将AJAX请求从计算属性移到初始化钩子中,避免重复请求,并将数据赋值为数组:

export default class RoomselectController extends Controller {
    @service router;
    @tracked rooms = []; // 初始化为空数组
    @tracked price = 0;

    init() {
        super.init(...arguments);
        this.fetchRooms();
    }

    fetchRooms() {
        const mobile = "123123123";
        $.ajax({
            url: 'My',
            method: 'GET',
            dataType: 'json',
            data: { mobile: mobile },
            success: (response) => {
                console.log(response);
                if (response.length > 0) {
                    this.price = response[0].PRICE;
                }
                this.rooms = response; // 直接赋值数组
            },
            error: (xhr, status, error) => {
                const errorMessage = `${xhr.status}: ${xhr.statusText}`;
                alert(`error ${errorMessage}`);
            }
        });
    }
}

3. 修改Handlebars模板

使用{{#each}}遍历数组,为每个房间对象生成一行表格:

<table border="1">
    <tr>
        <td><b>Capacity</b></td>
        <td><b>Price</b></td>
        <td><b>Room Type</b></td>
        <td><b>Room No</b></td>
    </tr>

    {{#each this.rooms as |room|}}
    <tr>
        <td>{{room.CAPACITY}}</td>
        <td>{{room.PRICE}}</td>
        <td>{{room.RTYPE}}</td>
        <td>{{room.ID}}</td>
    </tr>
    {{/each}}
</table>

临时兼容方案(无法修改Servlet时)

如果暂时无法调整服务器返回格式,可在前端手动解析响应文本,将多行JSON对象转为数组:
修改控制器的fetchRooms方法:

fetchRooms() {
    const mobile = "123123123";
    $.ajax({
        url: 'My',
        method: 'GET',
        dataType: 'text', // 禁用自动JSON解析
        data: { mobile: mobile },
        success: (responseText) => {
            // 分割行、过滤空行、逐个解析JSON
            const rooms = responseText.split('\n')
                .filter(line => line.trim() !== '')
                .map(line => JSON.parse(line));
            
            console.log(rooms);
            if (rooms.length > 0) {
                this.price = rooms[0].PRICE;
            }
            this.rooms = rooms;
        },
        error: (xhr, status, error) => {
            const errorMessage = `${xhr.status}: ${xhr.statusText}`;
            alert(`error ${errorMessage}`);
        }
    });
}

模板代码保持不变即可。


内容的提问来源于stack exchange,提问作者hariharan baskaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:15:29