Как напечатать содержимое объекта класса по полю?

1

У меня есть класс POJO, Location который используется для сопоставления файла JSON с классом с использованием Jackson. Текущая реализация может распечатывать каждый объект Location в классе, вызывая, Location toString(), но мне интересно, как я могу напечатать, например, только местоположение с id = "2", которое будет name = "Desert"

На данный момент я использую метод toString для печати всего содержимого Location:

public String toString() {
        return "Location [location=" + Arrays.toString(location) + ", id=" + id
                + ", description=" + description + ", weight=" + weight
                + ", name=" + name + ", exit=" + Arrays.toString(exit)
                +"]";
    }

Кто-нибудь знает, как я могу напечатать определенные местоположения в объекте Location на основе идентификатора поля?

Это пример того, что хранится в классе Location, когда я вызываю toString() на нем:

http://hastebin.com/eruxateduz.vhdl

Пример одной из локаций в объекте Location:

[Location [location=null, id=1, description=You are in the city of Tiberius. You see a long street with high buildings and a castle.You see an exit to the south., weight=100, name=Tiberius, exit=[Exit [title=Desert, direction=South]]]

Это класс местоположения POJO, который я использую для сопоставления полей JSON с классом:

public class Location {

    private Location[] location;

    private int id;

    private String description;

    private String weight;

    private String name;

    private Exit[] exit;

    private boolean visited = false;
    private boolean goalLocation;
    private int approximateDistanceFromGoal = 0;
    private Location parent;




    public Location[] getLocation() {
        return location;
    }

    public void setLocation(Location[] location) {
        this.location = location;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription ()
    {
        return description;
    }

    public void setDescription (String description)
    {
        this.description = description;
    }


    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public Exit[] getExit() {
        return exit;
    }

    public void setExit(Exit[] exit) {
        this.exit = exit;
    }


    public boolean isVisited() {
        return visited;
    }

    public void setVisited(boolean visited) {
        this.visited = visited;
    }

    public boolean isGoalLocation() {
        return goalLocation;
    }

    public void setGoalLocation(boolean goalLocation) {
        this.goalLocation = goalLocation;
    }

    public int getApproximateDistanceFromGoal() {
        return approximateDistanceFromGoal;
    }

    public void setApproximateDistanceFromGoal(int approximateDistanceFromGoal) {
        this.approximateDistanceFromGoal = approximateDistanceFromGoal;
    }

    public Location getParent() {
        return parent;
    }

    public void setParent(Location parent) {
        this.parent = parent;
    }

    @Override
    public String toString() {
        return "Location [location=" + Arrays.toString(location) + ", id=" + id
                + ", description=" + description + ", weight=" + weight
                + ", name=" + name + ", exit=" + Arrays.toString(exit)
                +"]";
    }



}
Теги:
jackson
pojo

3 ответа

1
Лучший ответ
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>

Для определения предиката вам нужна указанная выше зависимость, если вы не хотите делать это самостоятельно.

public class Location {
   private int id;
   // more stuff here

   private Predicate<Integer> filter;
     public Location() {
          this.filter = TruePredicate.INSTANCE; 
     }
     public Location(int idFilter) {
             this.filter = new EqualPrediate(idFilter);
     }

     public String toString() {
       StringBuilder buffer = new StringBuilder();
          if(filter.apply(this.id)) { 
             buffer.append("Location [location=" + Arrays.toString(location) + ", id=" + id
                + ", description=" + description + ", weight=" + weight
                + ", name=" + name + ", exit=" + Arrays.toString(exit)
                +"]");
          }
       return buffer.toString();
     }

}

Этот код является упрощенным шаблоном посетителя, где

"Посетитель" → ваш предикат

'this' → 'this.id'

Это работает, потому что toString() вызывает toString() объектов вложенного местоположения, которые также имеют свои предикаты для набора фильтров.

Если вы не контролируете их конструкцию, где вы можете распространять фильтр, вы можете использовать такой подход:

 public String toString() {
           StringBuilder buffer = new StringBuilder();
           int i = 0;
           for(Location l = this; i < locations.length; l = locations[i++])
              if(filter.apply(l.id) { 
                 buffer.append("Location [location=" + Arrays.toString(location) + ", id=" + id
                    + ", description=" + description + ", weight=" + weight
                    + ", name=" + name + ", exit=" + Arrays.toString(exit)
                    +"]");
              }
           return buffer.toString();
         }
  • 0
    После второй мысли мне кажется, что я должен использовать график для представления списка местоположений и мест доступа с помощью методов Location. Я разместил новый вопрос, связанный с созданием графика из списка: stackoverflow.com/questions/29403187/…
1
Stream.of(location).filters(l -> l.getId() == 2).foreach(System.out::println);

Это работает?

  • 0
    Он говорит, что мне нужно изменить, соответствие проекта и JRE до 1.8, это повлияет / сломает мой текущий проект?
  • 0
    Обновление виртуальной машины не должно. Но я видел какое-то сумасшествие с отражениями. Это значит, что если вы собираетесь использовать это в работе, ваше приложение должно быть развернуто на 1.8 и только на 1.8
Показать ещё 2 комментария
1

Вы можете попробовать с помощью gson, который вводит объект и выводит JSON или в противоположную сторону.

После того, как вы сделаете объект JSONObject, вы можете эргодично использовать JSON для эргодического объекта.

  • 0
    Не могли бы вы показать пример кода этого?
  • 0
    @BrianJ ты можешь искать gson

Ещё вопросы

Сообщество Overcoder
Наверх
Меню