我有json请求,可以包含下一个参数,最初我不知道参数的类型,它可以是:
“message”:“一条消息”
或
“message”:{“part_one”:“消息的第一部分”,“part_two”:“第二部分 消息“}
我尝试将此字段解析为字符串
String message;
和自定义消息对象
Message message;
class Message{
String part_one;
String part_two;
}
另外我尝试使用List,Map等,但是当类型不匹配时我有解析错误。
如何为fromJson()
函数(gson库)构建解析输出对象?
请帮忙。
答案 0 :(得分:2)
对于这个简单的例子,GSON相当深入,但如果您希望采用这种方法,那么广泛GSON user-guide。
简单的答案是使用内置于android SDK的他JSONObject class。有full JSON tutorial应该有帮助。
简单地:
JSONObject myObject = new JSONObject(myResponseString);
有几个函数可以从对象中提取数据,您可以在函数或响应对象构造函数中使用它来简化代码库。
如果您有一组对象,请使用JSONArray
最重要的是,请阅读http://developer.android.com
上的文档<强> UDPATE 强>
您可以使用optJSONObject方法检测“message”值是否为对象而不是简单字符串。
要使用您的示例类,请向您的消息类添加一个方法:
public static Message fromJson(string jsonString) throws JSONException
{
JSONOBject jsonObject = new JSONObject(jsonString);
Message message = new Message(); //create our return object
JsonObject messageObject = jsonObject.optJSONObject("message");
if(messageObject!=null)
{
//get our member variables from the messageObject
message.part_one = messageObject.getString("part_one");
message.part_two = messageObject.getString("part_two");
}
else
{ // it's a simple string so just get the string from jsonObject
message.part_one = jsonObject.getString("message");
}
return message;
}
当然,您应该添加异常处理,并且可能抛出自定义异常,或者如果解析失败则返回null。
答案 1 :(得分:0)
我的上一个解决方案 - 自定义
JsonDeserializer
Json消息:
1)成功消息
{"data": ["success"],
"message": "message_text"
}
2)错误消息
{"message": {
"name": ["message_text"],
"email": ["message_text"],
"subject": ["message_text"],
"body": ["message_text"]
}}
也许它可以帮助别人。
public static class GeneralResponceDeserializer implements JsonDeserializer {
@Override
public Object deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject jobject = (JsonObject) jsonElement;
Gson googleJson = new Gson();
ArrayList<String> dataList = null;
if (jobject != null && jobject.get("data") != null) {
JsonArray dataArray = jobject.get("data").getAsJsonArray();
dataList = googleJson.fromJson(dataArray, new TypeToken<List<String>>(){}.getType());
}
String message = null;
Message messageObject = null;
if (jobject != null && jobject.get("message") != null) {
try {
message = jobject.get("message").getAsString();
} catch (UnsupportedOperationException e) {
JsonElement messageObjectJson = (JsonObject) jobject.get("message").getAsJsonObject();
JsonObject jMessageobject = (JsonObject) messageObjectJson;
if (jMessageobject != null) {
JsonArray name = jMessageobject.getAsJsonArray("name");
JsonArray subject = jMessageobject.getAsJsonArray("subject");
JsonArray body = jMessageobject.getAsJsonArray("body");
JsonArray email = jMessageobject.getAsJsonArray("email");
ArrayList<String> nameDataList = null;
ArrayList<String> subjectDataList = null;
ArrayList<String> bodyDataList = null;
ArrayList<String> emailDataList = null;
if (name != null) {
nameDataList = googleJson.fromJson(name, new TypeToken<List<String>>(){}.getType());
}
if (subject != null) {
subjectDataList = googleJson.fromJson(subject, new TypeToken<List<String>>(){}.getType());
}
if (body != null) {
bodyDataList = googleJson.fromJson(body, new TypeToken<List<String>>(){}.getType());
}
if (email != null) {
emailDataList = googleJson.fromJson(email, new TypeToken<List<String>>(){}.getType());
}
messageObject = new Message(nameDataList, subjectDataList, bodyDataList, emailDataList);
}
}
}
return new GeneralResponceObject(dataList, message, messageObject);
}
}