#java #json #gson #jsonobject
#java #json #gson #jsonobject
Вопрос:
У меня есть несколько подобных классов. Я хочу преобразовать классы в формат JSONObject.
import java.io.Serializable;
import com.google.gson.annotations.SerializedName;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@SerializedName("id")
private Integer mId;
@SerializedName("name")
private String mName = "";
@SerializedName("email")
private String mEmail;
public Integer getId() {
return mId;
}
public void setId(Integer id) {
mId = id;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getEmail() {
return mEmail;
}
public void setEmail(String email) {
mEmail = email;
}
}
Я знаю, что могу преобразовать эти классы в формат JSONObject следующим образом:
User user = new User();
JSONObject jsonObj = new JSONObject();
try {
jsonObj.put("id", user.getId());
jsonObj.put("name", user.getName());
jsonObj.put("email", user.getEmail());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Проблема в том, что мне нужно сделать это для множества разных классов, которые намного длиннее, чем это, для большого количества файлов. Могу ли я использовать GSON для заполнения JSONObject из MyClass, чтобы мне не нужно было редактировать каждый раз при изменении структуры класса?
Следующее возвращает строку JSON, но она мне нужна как объект, поскольку, когда я отправляю ее в систему, которая отправляет запросы через REST API, она отправляет с нежелательными кавычками.
User user = new User();
Gson gson = new Gson();
Object request = gson.toJson(user);
Когда я использую это в другом JSON builder, который запрашивает объект, я получаю
{"request":"{"id":"100","name":"Test Name","email":"test@example.com"}"}
Когда я хочу
{"request":{"id":"100","name":"Test Name","email":"test@example.com"}}
Ответ №1:
Я обнаружил, что с GSON работает следующее:
User = new User();
Gson gson = new Gson();
String jsonString = gson.toJson(user);
try {
JSONObject request = new JSONObject(jsonString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Однако это небезопасно для типов.
Комментарии:
1. Обратите внимание, что это
JSONObject
происходит изorg.json
-за зависимости. Не изGSON
.2.
The constructor JSONObject(String) is undefined
получение этой ошибки.
Ответ №2:
Вот грубый пример, который вы можете использовать для использования отражения для построения JSONObject..
Предупреждение это не красиво и не содержит действительно безопасности типов.
public static JSONObject quickParse(Object obj) throws IllegalArgumentException, IllegalAccessException, JSONException{
JSONObject object = new JSONObject();
Class<?> objClass = obj.getClass();
Field[] fields = objClass.getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
Annotation[] annotations = field.getDeclaredAnnotations();
for(Annotation annotation : annotations){
if(annotation instanceof SerializedName){
SerializedName myAnnotation = (SerializedName) annotation;
String name = myAnnotation.value();
Object value = field.get(obj);
if(value == null)
value = new String("");
object.put(name, value);
}
}
}
return object;
}
Вот пример использования:
User user = new User();
JSONObject obj = quickParse(user);
System.out.println(obj.toString(3));
Вывод
{
"id": "",
"name": "",
"email": ""
}
Ответ №3:
Попробуйте использовать этот код:
// Returns the JSON in a String
public String getJSON()
{
Gson gson = new Gson();
return gson.toJson(this);
}
// Builds the Model Object from the JSON String
MyModel model =new MyModel();
JSONObject j = new JSONObject(model.getJSON());