无法通过Mixin反序列化 [英] Unable to deserialise via mixin

查看:61
本文介绍了无法通过Mixin反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

附件是我的json.我正在从端点收到此消息.我的消费应用程序中有对象类型.该对象包含;成功,消息和loggingInMember(这是一个对象).在json中,feeClasses包含很多字段和对象等,这就是为什么我没有包括整个json的原因.我只对successmessage字段感兴趣.

Attached is my json. I am receiving this from an endpoint. I have the object type in my consuming app. the object contains; success, message and loggedInMember (which is an object). In the json, the feeClasses contains a lot of fields and objects etc which is why i have not included the whole json. I am only interested in the success and message fields.

{
    "header":{
    "messageId":null,
            "receivedTimestamp":1611246394839,
            "replyTo":null,
            "redelivered":false,
            "originator":null
},
    "internalId":null,
        "auditPoints":[

],
        "success":true,
        "message":"",
        "loggedInMember":{
            "feeClasses":{
...CONTAINS A LOT OF FIELDS...
    }
}
}

我正在尝试将此响应映射到对象类型,因此本质上将loggedInMembers保留为空.这是我要运行的测试:

I am trying to map this response to the object type, hence essentially leaving loggedInMembers null. This is my test I am trying to run:

   public void test() throws JsonProcessingException
   {
      //String json = "{\"header\":{\"messageId\":null,\"bucketNumber\":null,\"senderSubId\":null,\"senderLocationId\":null,\"onBehalfOfCompId\":null,\"onBehalfOfSubId\":null,\"onBehalfOfLocationId\":null,\"correlationId\":null,\"receivedTimestamp\":1611246394839,\"replyTo\":null,\"redelivered\":false,\"originator\":null},\"internalId\":null,\"auditPoints\":[],\"success\":true,\"message\":\"\",\"loggedInMember\":{\"memberLoginName\":\"BMARTINTEST\",\"memberId\":\"201901241246290000036402D\",\"settlementAccountIds\":[\"201901241246290000036491D\"],\"parentMemberId\":\"1\",\"firmId\":\"990\",\"memberType\":\"INDIVIDUAL\",\"memberAccountType\":\"PROD\",\"password\":\"D1208B304FD7AA6187690A389A5040C1D9B07643\",\"feeClasses\":{\"byId\":{\"201902120947520000559606D\":{\"memberLoginName\":\"BMARTINTEST\",\"feeClassId\":\"201508041827550000942152D\",\"memberFeeClassId\":\"201902120947520000559606D\",\"allocatedDate\":{\"year\":2019,\"month\":2,\"day\":12,\"timeMillis\":1549929600000},\"firstUsedForTradeDate\":{\"year\":2019,\"month\":2,\"day\":12,\"timeMillis\":1549929600000},\"firstUsedForSettlementDate\":null,\"usableFromDate\":{\"year\":2019,\"month\":2,\"day\":12,\"timeMillis\":1549929600000},\"usableToDate\":{\"year\":2019,\"month\":2,\"day\":19,\"timeMillis\":1550534400000},\"usableToTimestamp\":1550613600000,\"usableBusinessDaysAllocated\":6,\"usableBusinessDaysRemaining\":0,\"narrative\":\"Bonus assigned to member at first-time funding of amount 4000.00 : Set expiration date/time\",\"disabled\":false,\"usableForTrade\":true,\"usableForSettlement\":true},\"202001290940390000868824D\":{\"memberLoginName\":\"BMARTINTEST\",\"feeClassId\":\"202001290940340000776406D\",\"memberFeeClassId\":\"202001290940390000868824D\",\"allocatedDate\":{\"year\":2020,\"month\":1,\"day\":29,\"timeMillis\":1580256000000},\"firstUsedForTradeDate\":null,\"firstUsedForSettlementDate\":null,\"usableFromDate\":{\"year\":2020,\"month\":1,\"day\":6,\"timeMillis\":1578268800000},\"usableToDate\":{\"year\":2020,\"month\":2,\"day\":27,\"timeMillis\":1582761600000},\"usableToTimestamp\":1582840800000,\"usableBusinessDaysAllocated\":0,\"usableBusinessDaysRemaining\":0,\"narrative\":\"Added NO_FEES_CLASS\",\"disabled\":false,\"usableForTrade\":true,\"usableForSettlement\":true},\"201901241246290000036417D\":{\"memberLoginName\":\"BMARTINTEST\",\"feeClassId\":\"201508041736360000943781D\",\"memberFeeClassId\":\"201901241246290000036417D\",\"allocatedDate\":{\"year\":2019,\"month\":1,\"day\":24,\"timeMillis\":1548288000000},\"firstUsedForTradeDate\":null,\"firstUsedForSettlementDate\":null,\"usableFromDate\":{\"year\":2019,\"month\":1,\"day\":24,\"timeMillis\":1548288000000},\"usableToDate\":null,\"usableToTimestamp\":null,\"usableBusinessDaysAllocated\":0,\"usableBusinessDaysRemaining\":0,\"narrative\":null,\"disabled\":false,\"usableForTrade\":true,\"usableForSettlement\":true}},\"empty\":false},\"legalName\":\"Martin Birch\",\"taxId\":\"345335454\",\"taxCountryId\":\"US\",\"currency\":\"USD\",\"lastTradeId\":null,\"introducingBrokerMemberId\":null,\"introducingBrokerMemberName\":null,\"introducingBrokerMemberCode\":null,\"clearedByMemberId\":\"SECOND_TEST\",\"clearedByMemberLoginName\":null,\"memberProblems\":[],\"emailNotificationEnabled\":true,\"rtafLevelId\":0,\"rtafAmount\":0,\"maxNumberOfPositionAccounts\":1,\"ciciIdentifier\":null,\"traderRequired\":false,\"interestClass\":\"INDIVIDUAL\",\"memberCreatedDate\":1548333989000,\"parentMemberLoginNames\":[\"NADEX.COM\",\"NADEX\"],\"demoStartDate\":null,\"demoEndDate\":null,\"clientIdMaxLimit\":null,\"memberAccountApplicationFieldData\":null,\"rank\":0,\"uuid\":\"201901241246290000036395D\",\"referrerId\":\"raf4qam5h00s36d\",\"testMember\":false},\"allReplyToSource\":[],\"sendToOriginatorOnly\":false}";
String json = "{\n" +
              "   \"header\":{\n" +
              "      \"messageId\":null,\n" +
              "      \"receivedTimestamp\":1611246394839,\n" +
              "      \"replyTo\":null,\n" +
              "      \"redelivered\":false,\n" +
              "      \"originator\":null\n" +
              "   },\n" +
              "   \"internalId\":null,\n" +
              "   \"auditPoints\":[\n" +
              "      \n" +
              "   ],\n" +
              "   \"success\":true,\n" +
              "   \"message\":\"\",\n" +
              "   \"loggedInMember\":{\n" +
              "      \"feeClasses\":{\n" +
              "         \n" +
              "      }\n" +
              "   }\n" +
              "}";
      ObjectMapper objectMapper = new ObjectMapper();
      objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
      objectMapper.addMixIn(LogonResponseMessage.class, LogonResponseMixin.class);

      LogonResponseMessage responseMessage = objectMapper.readValue(json, LogonResponseMessage.class);

      System.out.println(responseMessage);
   }

我的混音:

public abstract class LogonResponseMixin
{
   LogonResponseMixin(@JsonProperty("success") boolean success, @JsonProperty("message") String message){};

   @JsonIgnore
   abstract Member loggedInMember();

   @JsonIgnore
   abstract MemberFeeClasses feeClasses();

   @JsonIgnore
   abstract Header header();
}

我收到以下错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of domain.xyz.MemberFeeClasses (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

我创建mixin错误吗?我在先前的问题中曾问过,使用mixin是普遍共识,但似乎不适合我.

Am i creating the mixin wrong? I have asked in a previous question and using mixin was the general consensus but it doesn't seem to play ball with me.

谢谢.

推荐答案

无法构造MemberFeeClasses的原因与您最初遇到的问题相同,只需为所有类添加一个mixin

The reason why MemberFeeClasses cannot be constructed is the same as your initial problem, just add a mixin for all classes

请参见以下示例:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.Setter;

import java.io.IOException;

public class Test {

  //------------------------------------------------//
  //          PART 1 - MAIN TEST METHOD
  //------------------------------------------------//
  public static void main(String[] args) throws IOException {

    String json = "{\n" +
        "   \"header\":{" +
        "   },\n" +
        "   \"success\":true,\n" +
        "   \"message\":\"\",\n" +
        "   \"loggedInMember\":{\n" +
        "      \"feeClasses\":{\n" +
        "         \"amount\": \"20\"\n" +
        "      }\n" +
        "   }\n" +
        "}";
    ObjectMapper objectMapper = new ObjectMapper();
    //objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    objectMapper.addMixIn(LogonResponseMessage.class, LogonResponseMixin.class);
    objectMapper.addMixIn(Member.class, MemberMixin.class);
    objectMapper.addMixIn(MemberFee.class, MemberFeeMixin.class);

    LogonResponseMessage responseMessage = objectMapper.readValue(json, LogonResponseMessage.class);

    System.out.println(responseMessage.loggedInMember.feeClasses.amount);
  }

  //------------------------------------------------//
  //          PART 2 - CREATOR MIXIN
  //------------------------------------------------//
  static abstract class LogonResponseMixin {
    LogonResponseMixin(@JsonProperty("success") boolean success,
                       @JsonProperty("message") String message,
                       @JsonProperty("header") Header header,
                       @JsonProperty("loggedInMember") Member member) {
    }
  }

  static abstract class MemberMixin {
    MemberMixin(@JsonProperty("feeClasses") MemberFee feeClasses) {
    }
  }

  static abstract class MemberFeeMixin {
    @JsonCreator
    MemberFeeMixin(@JsonProperty("amount") String amount) {
    }
  }

  //------------------------------------------------//
  //          PART 3 - EXAMPLE CLASS DEFINITION
  //------------------------------------------------//
  static class Header {
  }

  @Getter
  @Setter
  static class Member {
    private MemberFee feeClasses;

    public Member(MemberFee feeClasses) {
      this.feeClasses = feeClasses;
    }
  }

  @Getter
  @Setter
  static class MemberFee {
    private String amount;
    public MemberFee(String amount) {
      this.amount = amount;
    }
  }

  @Getter
  @Setter
  static class LogonResponseMessage {
    private boolean success;
    private String message;
    private Header header;
    private Member loggedInMember;

    public LogonResponseMessage(boolean success, String message, Header header, Member member) {
      this.success = success;
      this.message = message;
      this.header = header;
      this.loggedInMember = member;
    }
  }
}

这篇关于无法通过Mixin反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆