Java Spring Boot не может прочитать результат из ключей, значение которых является hashmap - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть простой сервер, который читает все журналы с mongodb, но некоторые данные в БД имеют другой формат для своего свойства результата.

один из которых имеет свойство результата, имеющее значение, подобное хэш-карте:

{
    "event_name" : "Transfer", 
    "result" : { "_from" : "0x928c9af0651632157ef27a2cf17ca72c575a4d21", 
                   "_value" : "1111", 
                 "_to"  :"0x143449e55cdd2a5bae081f041650ba9089812a95" },  

 "transaction_id":"c2c986a96a0cfa7fc96619733449fd88c9d685bf704a50d07baef74f6
}

, тогда для свойства результата он возвращает пустой результат для меня,но если свойство результата выглядит так, как массив:

"result" : ["0x928c9af0651632157ef27a2cf17ca72c575a4d21",  "1111", "0x143449e55cdd2a5bae081f041650ba9089812a95"],

, то оно выведет значение результата. Дело в том, что оно имеетоба формата в mongodb, есть ли способ обработать оба из 2 различных форматов свойства результата?

import com.alibaba.fastjson.JSONArray;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document(collection = "eventLog")
public class EventLogEntity implements Serializable {

  private static final long serialVersionUID = -70777625567836430L;

  @Id
  private String id;

  @Field(value = "block_number")
  @JsonProperty(value = "block_number")
  private long blockNumber;

  @Field(value = "block_timestamp")
  @JsonProperty(value = "block_timestamp")
  private long blockTimestamp;

  @Field(value = "contract_address")
  @JsonProperty(value = "contract_address")
  private String contractAddress;

  @Field(value = "event_name")
  @JsonProperty(value = "event_name")
  private String entryName;

  @Field(value = "result")
  @JsonProperty(value = "result")
  private JSONArray resultJsonArray;

  @Field(value = "transaction_id")
  @JsonProperty(value = "transaction_id")
  private String transactionId;

  public EventLogEntity(long blockNumber, long blockTimestamp, String contractAddress,
      String entryName, JSONArray resultJsonArray, String transactionId) {
    this.blockNumber = blockNumber;
    this.blockTimestamp = blockTimestamp;
    this.contractAddress = contractAddress;
    this.entryName = entryName;
    this.resultJsonArray = resultJsonArray;
    this.transactionId = transactionId;
  }

  public static long getSerialVersionUID() {
    return serialVersionUID;
  }

  public long getBlockNumber() {
    return blockNumber;
  }

  public void setBlockNumber(long blockNumber) {
    this.blockNumber = blockNumber;
  }

  public long getBlockTimestamp() {
    return blockTimestamp;
  }

  public void setBlockTimestamp(long blockTimestamp) {
    this.blockTimestamp = blockTimestamp;
  }

  public String getContractAddress() {
    return contractAddress;
  }

  public void setContractAddress(String contractAddress) {
    this.contractAddress = contractAddress;
  }

  public String getEntryName() {
    return entryName;
  }

  public void setEntryName(String entryName) {
    this.entryName = entryName;
  }

  public JSONArray getResultJsonArray() {
    System.out.println(resultJsonArray.toString());
    return resultJsonArray;
  }

  public void setResultJsonArray(JSONArray resultJsonArray) {
    this.resultJsonArray = resultJsonArray;
  }

  public String getTransactionId() {
    return transactionId;
  }

  public void setTransactionId(String transactionId) {
    this.transactionId = transactionId;
  }
}

1 Ответ

0 голосов
/ 26 сентября 2018

Прежде всего, у вас есть 2 разных объекта документов, если вам действительно нужно сохранить оба формата и прочитать один или другой, у вас должен быть один объект для каждой структуры.Одна сущность будет такой же, как вы описали, а другая будет иметь свойство результата следующим образом:

public class ResultObject{
   private String _from;
   private String _value;
   private String _to;

   //getters, setters & constructor
}

И вы ссылаетесь на этот ResultObject как свойство вашей другой сущности:

public class EventLogEntityWithResultObject implements Serializable{
...
private ResultObject result;
...
}

Есливам не нужно сохранять обе структуры, вы можете перенести все документы из одного типа структуры в другой, используя команды MongoDB, см., например, следующее: Изменение структуры документа в mongodb с помощью оболочки mongo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...