使用angularjs从$ http响应中获取数据

时间:2017-02-06 11:43:35

标签: java angularjs json

我有用Java编写的服务器,我在其中创建如下的JSON对象:

@Override
public void serialize(Net net, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException {
    try {
        Set<Place> places = net.getPlaces();
        Set<Transition> transitions = net.getTransitions();
        JSONObject jsonPlaces = new JSONObject();
        for (Place p : places)
        {
            String id = p.getId();
            double xCoord = p.getxCoord();
            double yCoord = p.getyCoord();
            JSONObject jsonPosition = new JSONObject();
            jsonPosition.put("x", xCoord);
            jsonPosition.put("y", yCoord);

            JSONObject jsonPlace = new JSONObject();
            jsonPlace.put("position", jsonPosition);
            jsonPlaces.put(id, jsonPlace);
        }
        jg.writeRawValue(jsonPlaces.toString());

    } catch (Exception ex) {
        throw new IOException("...", ex);
    } 
}

结果对象为字符串(jsonPlaces.toString())如下所示:

{"id01":{"position":{"x":220,"y":90}},"id02":{"position":{"x":210,"y":250}}}

我使用下面的代码将其发送到我的网络应用程序,它使用serialize()方法..

@POST
@Path("/blindLayout")
@Consumes(MediaType.APPLICATION_JSON)
public Net blindLayout(Net net) throws Exception {
    .
    .
    return net;
}

这是应该收到响应的angularjs代码

.factory('Layout', function ($http, Notification, AnalysisConfig) {
     layoutPrototype.performLayout = function (net, options, defered) {

     if (net) {
        var address = AnalysisConfig.serverAddress + AnalysisConfig.resourceURI + AnalysisConfig.resources.blindLayout;
        $http.post(address, JSON.stringify(net), {timeout: AnalysisConfig.timeout})
        .then(function (response) {
            var data = response;
        },
        function (response) {
            Notification.error({
                title: 'Communication error',
                    ...
                });
            });
    }; 
};

我的问题是我无法从响应中获取数据。无论我尝试了什么,结果始终是undefined[object Object]。那么我应该如何从响应中获取数据,以便我可以使用alert()并编写类似

的内容
id01 (value of x, value of y)
id02 (value of x, value of y)
...

所以我也可以在我的应用中使用它?

1 个答案:

答案 0 :(得分:0)

$http.post(address, JSON.stringify(net), {timeout: AnalysisConfig.timeout}) .then(function (response) { var data = response.data; }, 返回一个承诺,该承诺使用的对象不仅包含正文,还包含标题和状态。因此,要检索您在后端创建的JSON,您可以执行以下操作:

for(var id in data){
  console.log(data[id]) //{"position":{"x":220,"y":90}}
  console.log(data[id].position) //{"x":220,"y":90}
}

然后如果你想迭代对象键,你可以做几件事

var arrayOfObjects = Object.keys(data).map(function(id){
    return data[id].position;
});
console.log(arrayOfObjects) // [{"x":220,"y":90}, {"x":210,"y":250}]

{{1}}