Джексон выбрасывает исключение JSONMappingException, которое нельзя преобразовать в java.lang.Comparable (через цепочку ссылок ***) - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть строка JSON.Я конвертирую его, используя ObjectMapper Джексона.Это строка JSON.

{
  "stat": "OK",
  "response": {
    "result": "auth",
    "status_msg": "Account is active",
    "devices": [
      {
        "device": "DPFZRS9FB0D46QFTM891",
        "type": "phone",
        "number": "XXX-XXX-0100",
        "name": "",
        "capabilities": [
            "auto",
            "push",
            "sms",
            "phone",
            "mobile_otp"
        ]
      },
      {
        "device": "DHEKH0JJIYC1LX3AZWO4",
        "type": "token",
        "name": "0"
      }
    ]
  }
}

Я определил объект как:

public class MyClass{
  private String stat;
  private Response response;
  //getters and setters
}

Затем я определил ответ как:

public class Response{
  private String result;
  private String statusMsg;
  private SortedSet<Device> devices = new TreeSet<Device>();
  //getters and setters
}

Наконец, устройствоопределяется как:

public class Device implements Comparator<device>{
  private String device;
  private String number;
  // etc variables
  @Override
public int compareTo(Device o) {
    // TODO Auto-generated method stub
    return o.getNumber().compareTo(this.number);
}

Наконец, когда я использую маппер:

mapper.readValue(json.getBytes(), MyClass.class);

я получаю следующее исключение: org.codehaus.jackson.map.JsonMappingException: устройство не может быть приведено к java.lang.Comparable (через цепочку ссылок: Response ["response"] -> Response ["devices"])

Что я должен сделать для реализации массива устройств sortedset в этом случае?

1 Ответ

0 голосов
/ 07 февраля 2019

Вам необходимо реализовать java.lang.Comparable интерфейс.Или предоставить компаратор для TreeSet конструктора.

class Device implements Comparable<Device> {

    private String device;
    private String number;

    @Override
    public int compareTo(Device o) {
        return o.number.compareTo(this.number);
    }
}

Или предоставить Comparator экземпляр для TreeSet:

TreeSet<Device> devices = new TreeSet<>(new Comparator<Device>() {
    @Override
    public int compare(Device o1, Device o2) {
        return o1.getNumber().compareTo(o2.getNumber());
    }
});

Так как Java 8:

TreeSet<Device> devices = new TreeSet<>((d1, d2) -> d1.getNumber().compareTo(d2.getNumber()));

Или даже немного лучше:

TreeSet<Device> devices = new TreeSet<>(Comparator.comparing(Device::getNumber));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...