2016-04-06 2 views
2

Я разработчик newbee для Android и задаюсь вопросом о преобразовании строки JSON в экземпляры класса с использованием GSON версии 2.6.1.Android: JSON для объектов с использованием GSON не работает

У меня есть необходимость преобразования строки, как это к объектам:

{ 
"Messages": [{ 
    "ForwardMsg": true, 
    "IsAdmin": true, 
    "MsgBody": "Some text", 
    "SysInfo": null, 
    "Recipients": ["Some test"] 
}, { 
    "ForwardMsg": true, 
    "IsAdmin": false, 
    "MsgBody": "Some other text", 
    "SysInfo": null, 
    "Recipients": ["Some test", "Some more text"] 
}] 
} 

С этим (http://howtodoinjava.com/best-practices/google-gson-tutorial-convert-java-object-to-from-json/) как вдохновение, я придумать следующее: У меня есть класс DemoMessageList, который выглядит как это:

import java.util.List; 

public class DemoMessageList { 

private List< DemoMessage> messages; 

public DemoMessageList() { 
} 

public List<DemoMessage> getMessages() { 
    return messages; 
} 

public void setMessages(List<DemoMessage> messages) { 
    this.messages = messages; 
} 

@Override 
public String toString() 
{ 
    return "Messages ["+ messages + "]"; 
} 
} 

и класс DemoMessage который выглядит следующим образом:

import java.util.List; 

public class DemoMessage { 
private Boolean forwardMsg; 
private Boolean isAdmin; 
private String msgBody; 
private String sysInfo; 
private List<String> recipients; 

public Boolean getForwardMsg() { 
    return forwardMsg; 
} 

public void setForwardMsg(Boolean forwardMsg) { 
    this.forwardMsg = forwardMsg; 
} 

public Boolean doForwardMsg() { 
    return forwardMsg; 
} 

public Boolean getIsAdmin() { 
    return isAdmin; 
} 

public void setIsAdmin(Boolean isAdmin) { 
    this.isAdmin = isAdmin; 
} 

public String getMsgBody() { 
    return msgBody; 
} 

public void setMsgBody(String msgBody) { 
    this.msgBody = msgBody; 
} 

public String getSysInfo() { 
    return sysInfo; 
} 

public void setSysInfo(String sysInfo) { 
    this.sysInfo = sysInfo; 
} 

public List<String> getRecipients() { 
    return recipients; 
} 

public void setRecipients(List<String> recipients) { 
    this.recipients = recipients; 
} 
} 

Когда я делаю это, чтобы попытаться преобразовать:

public void test() { 
String demoData = {"Messages": [{ "ForwardMsg": true, "IsAdmin": false,"MsgBody": "Some other text", "SysInfo": null, "Recipients": ["Some test", "Some more text"]}]} 
Log.d("AsData ", "demoData: " + demoData); 
Gson gson = new Gson(); 
DemoMessageList dmList = gson.fromJson(demoData, DemoMessageList.class); 
Log.d("AsList ", "dmList: " + dmList.toString()); 
Log.d("ListSize ", "dmList - Size: " + String.valueOf(dmList.getMessages().size())); 
} 

Я получаю этот вход:

demoData: {"Messages": [{ "ForwardMsg": true, "IsAdmin": false, "MsgBody": "Some other text", "SysInfo": null, "Recipients": ["Some test", "Some more text"]}]} 
dmList: Messages [null] 
dmList - Size: 0 

Почему это обязательно ?? Пожалуйста, помогите !!!

ответ

2

Ваши имена JSON отличаются от ваших имен полей класса. GSON смотрит на ваши имена полей для преобразования.

Используйте свой класс модели, как это с пользовательским именованием,

@SerializedName("ForwardMsg") 
private Boolean forwardMsg; 
@SerializedName("IsAdmin") 
private Boolean isAdmin; 
@SerializedName("MsgBody") 
private String msgBody; 
@SerializedName("SysInfo") 
private String sysInfo; 
@SerializedName("Recipients") 
private List<String> recipients; 

и держать другой класс,

@SerializedName("Messages") 
private List< DemoMessage> messages; 
1

Используйте ГорбатыйРегистр ваших имен свойств JSON:

{ 
"messages": [{ 
    "forwardMsg": true, 
    "isAdmin": true, 
    "msgBody": "Some text", 
    "sysInfo": null, 
    "recipients": ["Some test"] 
}, { 
    "forwardMsg": true, 
    "isAdmin": false, 
    "msgBody": "Some other text", 
    "sysInfo": null, 
    "recipients": ["Some test", "Some more text"] 
}] 
} 

.. и введите имена полей в соответствие с именами свойств JSON, например:

private List<DemoMessage> messages; 

Вкратце: Имена свойств JSON должны совпадать с полями, определенными в ваших классах, как по орфографии, так и по буквам.

0

Вы рок ребята !! Ответ

Бхарата Mg»отлично работает в моем небольшом тесте, при добавлении этого:

import com.google.gson.annotations.SerializedName; 

Я не имею никакого контроля над строкой, содержащей JSON в реальном приложении, как это предусмотрено в WebService.

Это прослушивание меня в течение 2 дней, так что я с нетерпением жду продолжения проекта.

Еще раз спасибо

0

Ответ Бхарата верен. Имена полей чувствительны к регистру.

Смежные вопросы