От нескольких переменных до строковой строки JSON [duplicate]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

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

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
2
задан exebook 5 October 2013 в 06:13
поделиться

4 ответа

Вы можете использовать Apocal's Commons-lang's ToStringBuilder.reflectionToString

Конечно, отражение медленное, поэтому используйте это только с помощью тестового кода. для нормального использования, используйте меню «Источник» eclipse -> сгенерируйте toString () (или intellij сгенерируйте toString ()), что дает вам приличную строку.

3
ответ дан Shawn 18 August 2018 в 21:51
поделиться
  • 1
    отражение не особенно медленное. Это хорошо. – MeBigFatGuy 5 October 2013 в 07:00
  • 2
    спасибо, это то, что я хочу. но я нашел google gson, и поскольку он печатает Json, который мне больше знакомы, я использую это. – exebook 6 October 2013 в 04:01

У вас есть два варианта. Простым является просто переопределение функции toString для вашего класса. Я не понимаю, почему вы этого не делаете. В этом случае это так же просто, как

String toString(){
    return "{ name:\""+name+", password: \""+passowrd....
}

. Второй вариант - использовать отражение. Это было бы немного (хотя и не совсем) лучше, если бы у вас был какой-то внешний класс, используемый для «классов печати». Псевдокод для этого будет

StringBuilder s = new StringBuidler();
for(Field f : fields){
    s.append(f.getName() + "\" :\"" + f.get()+ "\"");
}
return s.toString();

Однако это было бы дорогостоящим, поскольку отражение всегда есть. Кроме того, если вы просто правильно переопределяете функции toString, в первую очередь ваша функция printClass может быть буквально просто

String printClass(Object o){ return o.toString();}

Что, конечно же, снова задает вопрос о том, зачем вам нужен printClass функция?

1
ответ дан David Grinberg 18 August 2018 в 21:51
поделиться

Один из вариантов - использовать Google Gson.

import java.util.ArrayList; import java.util.List; import com.google.gson.Gson;

class Project {
private int year = 1987;
private String name = "ROBOCOP-1";
private boolean active = false;
private List<String> list = new ArrayList<String>() {
  {
    add("PROTECT THE INNOCENT");
    add("UPHOLD THE LAW");
    add("SERVE THE PUBLIC TRUST");
    add("CLASSIFIED");
  }
};
}

public class GsonExample {
public static void main(String[] args) {
    Project obj = new Project();
    Gson gson = new Gson();
    String json = gson.toJson(obj);
    System.out.println(gson.toJson(obj));
}
}
0
ответ дан exebook 18 August 2018 в 21:51
поделиться

Существует много способов добиться того, что вам нужно. Хотя мне было бы интересно , почему вам нужно.

  1. Переопределить метод toString(). см.: http://www.javapractices.com/topic/TopicAction.do?Id=55
  2. Если алгоритм генерации слишком длинный, тогда рассмотрим отдельный класс, скажем UserPrettyPrinter.
    public interface UserPrettyPrinter {
      string print(User);
    }
    
    public class PrintUserInJSON implements UserPrettyPrinter {
      string print(User user) {
        //implement the algo here
      }
    }
    
    вы также можете реализовать:
    public class PrintUserInXML implements UserPrettyPrinter {
      string print(User user) {
        //implement the algo here
      }
    }
    
  3. Либо в спряжении с number-2 , либо в качестве отдельного класса вы можете написать
    public class PrintObjectBasicAlgo {
      String print(Object obj) {
        /* i write pseudo code here. just ask if you cannot implement this
        this would help: http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html
    
        Class class = Obj.getClass();
    
        Filed[] allVariables = class.getAllFieldsByReflection();
    
        ArrayList<String> keys = new ArrayList<String>;
        ArrayList<String> values = new ArrayList<String>;
    
        for(Field field : allVariables) {
            Object value = reflectionGetValueOfField( field, obj );
            keys.add( field.getName());
            values.add(value.toString());
        }
    
        now that you have the keys and values, you can generate a string in anyway you like
    
        */
      }
    }
    
  4. Вы можете увидеть шаблон посетителя . это может быть полезно.
2
ответ дан inquisitive 18 August 2018 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: