【问题标题】:Deserialize with Dependency Injection使用依赖注入反序列化
【发布时间】:2021-04-23 19:45:47
【问题描述】:

我有一个嵌套的 Json 对象,我想将其反序列化为 Account 对象。

Json 示例:

   {
     "status": "OK",
     "output": {
    "accountNum": ".....",
    "customerType": ".....",
    "homeNumber": ".....",
    "homeIndicator": ".....",
    "eligible": true,
    "startDate": "2017-01-01",
    "contactDetails": {
        "firstName": ".....",
        "lastName": ".....",
        "addressStreet": ".....",
    },
    "indicators": [
        "ind1",
        "ind2",
    ],
    "employees": [
        {
            "name": ".....",
            "email": ".....",
            "model": ".....",
            "program": [
                {
                    "name": ".....",
                    "date": "....."
                },
                {
                    "name": ".....",
                    "date": "....."
                }
            ],
            "type": ".....",
            "indicators": [
                "....."
            ],
            "customer": false
        }
    ],
}
 }

由于它是一个嵌套的 Json,我使用以下方法来做到这一点:

ObjectMapper mapper = new ObjectMapper();
    Flux<Timed<XXXDto >> mergedMonos = Flux.fromIterable(jsonList).flatMapSequential(Function.identity());
    mergedMonos.map(timed -> mapper.valueToTree(timed.get())).collectList().subscribe(System.out::print);

@Component
public class XXXDto {

@Autowired
private Account account;

@JsonProperty("output")
private void unpackOutput(Map<String, Object> output) {
    //Account a1 = new Account();
    // this.account.setAccountNum is null 

    output.get("accountNum");

问题是我想将“accountNum”存储在 Account 对象中,但在反序列化期间注入 Account 为空。

我可以在 unpackOutput 方法中创建一个实例,但我想看看是否有其他选项通过注入。

我们将不胜感激。

谢谢

【问题讨论】:

  • 你能举一个你想要反序列化的json的例子吗?
  • 抱歉,在问题中添加示例

标签: java spring-boot jackson


【解决方案1】:

我能够使用这些类和这段代码反序列化示例输入。

首先,这是格式化的输入:

{
   "status":"OK",
   "output":{
      "accountNum":".....",
      "customerType":".....",
      "homeNumber":".....",
      "homeIndicator":".....",
      "eligible":true,
      "startDate":"2017-01-01",
      "contactDetails":{
         "firstName":".....",
         "lastName":".....",
         "addressStreet":"....."
      },
      "indicators":[
         "ind1",
         "ind2"
      ],
      "employees":[
         {
            "name":".....",
            "email":".....",
            "model":".....",
            "program":[
               {
                  "name":".....",
                  "date":"....."
               },
               {
                  "name":".....",
                  "date":"....."
               }
            ],
            "type":".....",
            "indicators":[
               "....."
            ],
            "customer":false
         }
      ]
   }
}

这些是我使用的类:

public class ContactDetails{
    public String firstName;
    public String lastName;
    public String addressStreet;
}

public class Program{
    public String name;
    public String date;
}

public class Employee{
    public String name;
    public String email;
    public String model;
    public List<Program> program;
    public String type;
    public List<String> indicators;
    public boolean customer;
}

public class Output{
    public String accountNum;
    public String customerType;
    public String homeNumber;
    public String homeIndicator;
    public boolean eligible;
    public String startDate;
    public ContactDetails contactDetails;
    public List<String> indicators;
    public List<Employee> employees;
}

public class Root{
    public String status;
    public Output output;
}

这是我用来反序列化的代码:

ObjectMapper objectMapper = new ObjectMapper();

Root root = objectMapper.readValue(input2, Root.class);

这很简单,所以我想知道我是否遗漏了什么。

【讨论】:

  • 嗨阿里,首先感谢您的努力。感谢。在我的场景中,我只有两个对象(两个数据库表)。 Json 有点混合,这意味着输出级别中的一些属性应该映射到表 b(员工)中,例如 homeNumber。我最终所做的是在构造函数中初始化对象,然后在 unpackOutput 方法中映射所有属性。不过,我喜欢你的回答,这也是一种有效的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多