当前位置: 首页 > 知识库问答 >
问题:

@RequestBody将复杂JSON映射到简单对象

司徒高寒
2023-03-14

POJO类:

public class Transaction implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    private String userName;
    private String apiKey;
    private int amount;
    private String accountNumber;
    private String expirationDate;
    private String cscCode;
    private String customerAccountCode;
    private String firstName;
    private String lastName;
    private String street;
    private String city;
    private String state;
    private String zipCode;
    private String phoneNumber;
    private String description;
    private String responseCode;
    private String responseMessage;
    private String authCode;
    private String avsResultCode;
    private String cvvResultCode;


}

控制器:

@PostMapping
@ResponseStatus(OK)
public @ResponseBody ResponseEntity<transactionDto> 
        createTransaction(@RequestBody TransactionDto transactionDto) {

    System.out.println(transactionDto);

    return new ResponseEntity<Object>(transactionDto, OK);
}

JSON请求:

{
    "createTransactionRequest": {
        "merchantAuthentication": {
            "name": "8r6dGL5hRZ",
            "transactionKey": "72Ybq7QdQf475FjJ"
        },
        "refId": "123456",
        "transactionRequest": {
            "transactionType": "authCaptureTransaction",
            "amount": "5",
            "payment": {
                "creditCard": {
                    "cardNumber": "5424000000000015",
                    "expirationDate": "2020-12",
                    "cardCode": "999"
                }
            },
            "lineItems": {
                "lineItem": {
                    "itemId": "1",
                    "name": "vase",
                    "description": "Cannes logo",
                    "quantity": "18",
                    "unitPrice": "45.00"
                }
            },
            "tax": {
                "amount": "4.26",
                "name": "level2 tax name",
                "description": "level2 tax"
            },
            "duty": {
                "amount": "8.55",
                "name": "duty name",
                "description": "duty description"
            },
            "shipping": {
                "amount": "4.26",
                "name": "level2 tax name",
                "description": "level2 tax"
            },
            "poNumber": "456654",
            "customer": {
                "id": "99999456654"
            },
            "billTo": {
                "firstName": "Ellen",
                "lastName": "Johnson",
                "company": "Souveniropolis",
                "address": "14 Main Street",
                "city": "Pecan Springs",
                "state": "TX",
                "zip": "44628",
                "country": "USA"
            },
            "shipTo": {
                "firstName": "China",
                "lastName": "Bayles",
                "company": "Thyme for Tea",
                "address": "12 Main Street",
                "city": "Pecan Springs",
                "state": "TX",
                "zip": "44628",
                "country": "USA"
            },
            "customerIP": "192.168.1.1",
            }
        }
    }
}

问题:

当我处理请求时,我收到一个空的TransactionDto对象。

System.out.println(transactionDto)

TransactionDto(id=null,userName=null,apiKey=null,amount=0,accountNumber=null,expirationDate=null,cscCode=null,customerAccountCode=null,firstName=null,lastName=null,street=null,city=null,state=null,zipCode=null,phoneNumber=null,description=null)

如何使用Jackson将嵌套的JSON请求映射到简单的TransactionDto对象?或者其他一些?谢谢!

共有2个答案

昝光临
2023-03-14

事务类是否与TransactionDto相同?

如果是这样,您可以在构造函数中添加@JsonCreator注释,并将此请求转换为所需的类。

public class Transaction {
     // Using map to collect all properties at once
     @JsonCreator
     public Transaction(Map<String, Object> properties) {
          this.name = properties.get("createTransactionRequest.merchantAuthentication.name");
     ...
     }

     // Using property annotation to specify
     @JsonCreator
     public Transaction(@JsonProperty("createTransactionRequest.merchantAuthentication.name") String name, ...) {
          this.name = name;
     ...
     }

}

有关更多详细信息:http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html

商麒
2023-03-14

尝试在TransactionDto上注释@XmlRootElement

 类似资料:
  • 我想映射这个JSON数据: 对于此java对象: 但是它失败了,所有的值都是。我尝试在变量上方添加,但没有成功。 是否可以反序列化JSON,使其仅映射到(这个)一个类? 编辑:我使用Spring StreamListener进行如下映射:

  • 问题内容: 我正在尝试将JSON文件映射到类对象,然后根据新接收的JSON更新卡。 我的JSON结构是这样的 我的班级看起来像这样: 如何将JSON文件中的值映射到CardInfo类创建的对象的字段中? 更新资料 以下试用版在 ci.description上 打印为null ,是否表示从未创建该对象? 更新2 打印cardInfo给出以下内容: {$ class:FirstCard,id:1,说明

  • 假设我有这样的物体 我正在使用RestTemboard类从URL中获取json,如下所示: 之后,我想使用jackson对象映射器将json字符串转换为一个对象 将实体类作为第二个参数传递 问题是我应该如何编写ExampleJson实体来处理get-Showed json?我试过这样上课,但似乎不管用。 我得到了这样一个例外:

  • 生成的对象不能是对象的,而是任何类型的,它包含与示例相同的值--只是转换为number。 我必须指定我自己的Jackson反序列化器吗(我怎么做?)对于这个问题,还是改变构造函数就足够了?

  • 问题内容: 我在使用Jackson映射Javascript发布的哈希表(标记)数组时遇到问题。 这是控制器@RequestBody接收到的数据(以正确的json requestheader发送): 这是控制器: 当我调试并查看“实体”值时,它显示为通用对象的ArrayList,而不是我期望的“标签”类型的对象列表。 我如何让杰克逊将传递的对象数组映射到“标签”类型的对象列表? 谢谢 问题答案: 听