如何反序列化的JSON / GSON这可能是一个字符串,对象或列表 [英] how to deserialize a json/gson that could be a string , object ,or list
问题描述
我有以下的JSON
"notes": {"note": [
{
"content": "Having wisdom teeth removed.",
"from": "employee"
},
{
"content": "Get well soon",
"from": "manager"
}
]},
的问题是,值也coud是
the issue is that the value coud also be
"notes": "",
或
"notes": {"note": {
"content": "This is a test note.",
"from": "employee"
}},
和将其存储在这些
public class Notes
{
@SerializedName ("note")
public List<Note> note;
}
public class Note
{
@SerializedName ("content")
public String content;
@SerializedName ("from")
public String from;
}
我相信我解决的不是一个数组但这样做是一个单一对象的问题
I believe I solved the issue of not being an array but being an single object by doing this
public class Json {
private static Gson gson;
private static class MyNoteClassTypeAdapter implements JsonDeserializer<List<RequestsDTO.Note>> {
public List<RequestsDTO.Note> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) {
List<RequestsDTO.Note> vals = new ArrayList<RequestsDTO.Note>();
if (json.isJsonArray()) {
for (JsonElement e : json.getAsJsonArray()) {
vals.add((RequestsDTO.Note) ctx.deserialize(e, RequestsDTO.Note.class));
}
} else if (json.isJsonObject()) {
vals.add((RequestsDTO.Note) ctx.deserialize(json,RequestsDTO.Note.class));
} else {
throw new RuntimeException("Unexpected JSON type: " + json.getClass());
}
return vals;
}
}
public static Gson getGson()
{
if (gson == null)
{
Type ListType = new TypeToken<List<RequestsDTO.Note>>() {}.getType();
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(DateTime.class, new DateTimeSerializer());
builder.registerTypeAdapter(ListType, new MyNoteClassTypeAdapter());
gson = builder.create();
}
return gson;
}
}
而现在我坚持的时候,整个事情刚回来作为字符串上......
And now I am stuck on when the whole thing just comes back as a string....
推荐答案
我们的想法是尽量让音符
字段(从注意事项
的JSONObject
)的 JSONArray
第一,如果它抛出异常,这将意味着有没有注意
JSONArray
到音符
的JSONObject
,这将意味着音符
是的JSONObject
。我们可以计算出状况时,注
字段是用同样的方法字符串
。
The idea is try to get "note"
field (from "notes"
JSONObject
) as JSONArray
first and if it throws exception that will mean that there is no "note"
JSONArray
into "notes"
JSONObject
and that will mean that "note"
is JSONObject
. The same way we can figure out situation when note
field is String
.
try {
//String jsonString="{\"notes\": {\"note\": [{\"content\": \"Having wisdom teeth removed.\",\"from\": \"employee\" }, {\"content\": \"Get well soon\", \"from\": \"manager\"} ] }}";
//String jsonString="{\"notes\": { \"note\": {\"content\": \"This is a test note.\",\"from\": \"employee\"}}}";
String jsonString="{\"notes\": { \"note\": \"\"}}";
JSONObject jsonObject=new JSONObject(jsonString);
JSONObject jsonObjectNotes=jsonObject.getJSONObject("notes");
try{
JSONArray jsonArrayNote=jsonObjectNotes.getJSONArray("note");
for (int i = 0; i < jsonArrayNote.length(); i++) {
JSONObject jsonObject2= jsonArrayNote.getJSONObject(i);
String stringContent=jsonObject2.getString( "content");
String stringFrom= jsonObject2.getString( "from");
Log.e(getClass().getName(), "content="+stringContent +"; from="+stringFrom);
}
}
catch(JSONException e){
//that means that jsonObjectNotes has no jsonArray with name "notes" and "notes" is jsonObject
try{
JSONObject jsonObject3=jsonObjectNotes.getJSONObject("note");
String stringContent=(String) jsonObject3.get( "content");
String stringFrom=(String) jsonObject3.get( "from");
Log.e(getClass().getName(), "content="+stringContent +"; from="+stringFrom);
}
catch(JSONException ex){
//that means that jsonObjectNotes has no jsonObject with name "notes" and "notes" is empty String
String stringNote=jsonObjectNotes.getString("note") ;
Log.e(getClass().getName(), "note is string ="+ stringNote);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
在我的例子code另一个 GET
的操作也会抛出jsonExceptions但我认为你的想法。
In my example code another get
operations can also throw jsonExceptions but I think you get the idea.
这篇关于如何反序列化的JSON / GSON这可能是一个字符串,对象或列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!