Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWS lambda java响应不支持嵌套对象?_Java_Json_Amazon Web Services_Aws Lambda - Fatal编程技术网

AWS lambda java响应不支持嵌套对象?

AWS lambda java响应不支持嵌套对象?,java,json,amazon-web-services,aws-lambda,Java,Json,Amazon Web Services,Aws Lambda,我是Java新手,所以这可能与AWS lambda没有任何关系。然而,lambda对输入/输出对象有如此大的自由度,我认为这是罪魁祸首 我正在构建我的第一个lambda函数,并希望返回一个简单的JSON结构(本例进一步简化): 但是,当lambda序列化JSON时,它总是将“person”设置为空对象 { "document": "1", "person": {} } 以下是我的完整代码: - test1.java package handler_test; import com.a

我是Java新手,所以这可能与AWS lambda没有任何关系。然而,lambda对输入/输出对象有如此大的自由度,我认为这是罪魁祸首

我正在构建我的第一个lambda函数,并希望返回一个简单的JSON结构(本例进一步简化):

但是,当lambda序列化JSON时,它总是将“person”设置为空对象

{
  "document": "1",
  "person": {}
}
以下是我的完整代码:

 - test1.java
package handler_test;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class test1 implements RequestHandler<String, ResponseClass> {
    @Override
    public ResponseClass handleRequest(String input, Context context) {
      return new ResponseClass();
    }
}

 - ResponseClass.java
package handler_test;
import org.json.JSONException;
import org.json.JSONObject;
public class ResponseClass {
    String document;
    JSONObject person;

    public String getdocument() {
        return "1";
    }

    public JSONObject getperson() {
        try {
            return new JSONObject("{ \"name\" : \"John Doe\" }");
        } catch (JSONException e1) {
            System.out.println("error creating jsonobject");
            return null;
        }
    }

    public ResponseClass() {
    }
}
-test1.java
包装处理试验;
导入com.amazonaws.services.lambda.runtime.Context;
导入com.amazonaws.services.lambda.runtime.RequestHandler;
公共类test1实现RequestHandler{
@凌驾
公共响应类HandlerRequest(字符串输入、上下文){
返回新的ResponseClass();
}
}
-ResponseClass.java
包装处理试验;
导入org.json.JSONException;
导入org.json.JSONObject;
公共类响应类{
字符串文件;
j对象人;
公共字符串getdocument(){
返回“1”;
}
公共JSONObject getperson(){
试一试{
返回新的JSONObject(“{\”name\“:\”johndoe\“}”);
}捕获(JSONException e1){
System.out.println(“创建jsonobject时出错”);
返回null;
}
}
公共响应类(){
}
}

我已经尝试过几十种不同的方法,使用对象而不是JSONObject,将getperson输出转换为字符串(如果我想要一个字符串,这是可行的),等等。如果我存储值并将它们打印到记录器,就可以了。但当我试图通过lambda返回它时,它就变成了梨形。我已经浏览了“网络”,除了Amazon的“问候语”示例代码外,在AWS lambda java响应对象上找不到更多内容,该示例代码只包含两个字符串。非常感谢您的任何建议

您可以跳过
JSONObject
并为嵌套类使用POJO。然而,按照约定命名在这里很重要。确保您的访问器方法使用camel大小写命名(get+属性名称大写)。试试这个:

public class ResponseClass {
    String document;
    Person person;

    public String getDocument() {
        return "1";
    }

    public Person getPerson() {
        return person;
    }
}

class Person {
    String name;
    public String getName() {
        return name;
    }
}

我使用流处理程序解决了这个问题,它不仅可以工作,而且您有更多的控制和更少的代码!我使用gson进行JSON序列化/反序列化,使用apacheioutils将inputsteam转换为字符串。因为我已经使用请求和响应类编写了它,所以我继续使用它们,尽管我能够摆脱所有getter和setter代码

注二: 1.gson将输出响应类的所有非null属性,甚至 如果它们被声明为私有,那么如果存在您不想使用的值 回吐确保在最后一行之前将其设置为null。 2.当将EclipseIDE与AWS插件一起使用时,它不会将代码上载到AWS,除非它能够找到RequestHandler!因此,我有一个存根函数,它被立即重写

import com.google.gson.*;
import org.apache.commons.io.IOUtils;
import com.amazonaws.services.lambda.runtime.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;

public class Intel implements RequestStreamHandler, RequestHandler<Object, Object> {
    @Override
    public Object handleRequest(Object input, Context context) {
        return null;
    }

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        Request req = new Gson().fromJson(IOUtils.toString(inputStream, "UTF-8"), Request.class);
        Response resp = new ResponseClass();
            resp.id = 1;
            resp.person.name = req.name;
            et_home_phone(req.name);
        outputStream.write(new Gson().toJson(resp).getBytes(Charset.forName("UTF-8")));
    }

    private void get_home_phone(String name) {
        // call external API -- stub example!  Assumes only one phone returned
        // in the format { "number" : "123-456-7890", "type" = "home" }
        // gson magic assures they get copied to the keys of the same name
        HttpGet httpGet = new HttpGet(phoneURL + "/" + name));
        HttpResponse httpResponse = client.execute(httpGet);
        resp.phone[0] = new Gson().fromJson(IOUtils.toString(httpResponse .getEntity().getContent(), "UTF-8"), Response.Phone.class);
    }
}

public class Response {
    public class Person {
        String name;
    }
    public class Phone {
        String number;
        String type;
    }
    public Integer id;
    public Person person = new Person();
    public Phone[] phone = new Phone[5];
}
import com.google.gson.*;
导入org.apache.commons.io.IOUtils;
导入com.amazonaws.services.lambda.runtime.*;
导入org.apache.http.HttpResponse;
导入org.apache.http.client.methods.HttpGet;
公共类Intel实现RequestStreamHandler,RequestHandler{
@凌驾
公共对象handleRequest(对象输入、上下文){
返回null;
}
@凌驾
公共void handleRequest(InputStream InputStream、OutputStream OutputStream、上下文上下文)引发IOException{
Request req=new Gson().fromJson(IOUtils.toString(inputStream,“UTF-8”),Request.class);
Response resp=新的ResponseClass();
相应id=1;
resp.person.name=请求名称;
家庭电话(请求名称);
write(new Gson().toJson(resp).getBytes(Charset.forName(“UTF-8”));
}
私人void get_home_电话(字符串名称){
//调用外部API——存根示例!假设只返回一个电话
//格式为{“编号”:“123-456-7890”,“键入”=“主页”}
//gson magic确保它们被复制到同名的密钥
HttpGet-HttpGet=newhttpget(phoneURL+“/”+name));
HttpResponse HttpResponse=client.execute(httpGet);
resp.phone[0]=new Gson().fromJson(IOUtils.toString(httpResponse.getEntity().getContent(),“UTF-8”),Response.phone.class);
}
}
公众课堂反应{
公共阶层人士{
字符串名;
}
公用电话{
字符串编号;
字符串类型;
}
公共整数id;
公众人物=新人();
公用电话[]电话=新电话[5];
}
来自文档:

如果是包装基元值的类型,则运行时将返回该值的文本表示形式


因此,具有单个字符串属性的simple person类将返回如下内容:

{ "document": "1", "person": "john doe" }
将另一个字段添加到person类,它将根据需要工作:

class Person {
    String firstName;
    String lastName;
    ...
}
输出:

{ "document": "1", "person": { "firstName": "John", "lastName": "Doe" }}

参考这个,也就是这个谢谢。这就是我提到的“问候语”示例代码,它只返回一个简单的对象。AWS没有任何返回更复杂内容的样本。他们确实提到,如果开箱即用的序列化对您不起作用,您可以编写自己的JSON序列化,但没有说明如何做到这一点!作为java和lambda的新手,我不知所措。(坦率地说,在JSON对象中返回JSON对象似乎并不是一个非同寻常的请求,我应该使用自己的工具,尽管在lambda中似乎没有其他人这么做。)嘿@Gregg,关于这个问题,你有正确的解决方案吗?如果是,请在这里分享。我也想知道这个问题的答案。不幸的是,这并没有创建嵌套对象,只有一个顶级键;例如:{“document”:“1”,“person”:“johndoe”}如果我更改person类以返回一个JSON对象(这就是我想要的),我会得到相同的结果:一个空的“person”对象。{“文件”:“1”,“人”:{}}@Gregg:面临类似问题。在POJO中定义默认构造函数将解决这个问题。我认为您应该接受自己的答案。T
{ "document": "1", "person": { "firstName": "John", "lastName": "Doe" }}