使用 Gson 将 JSON 数组解析为 java.util.List
Posted
技术标签:
【中文标题】使用 Gson 将 JSON 数组解析为 java.util.List【英文标题】:Parsing JSON array into java.util.List with Gson 【发布时间】:2013-09-03 20:18:06 【问题描述】:我有一个名为"mapping"
的JsonObject
,其内容如下:
"client": "127.0.0.1",
"servers": [
"8.8.8.8",
"8.8.4.4",
"156.154.70.1",
"156.154.71.1"
]
我知道我可以通过以下方式获取数组"servers"
:
mapping.get("servers").getAsJsonArray()
现在我想将 JsonArray
解析为 java.util.List
...
最简单的方法是什么?
【问题讨论】:
Easy way to change Iterable into Collection 或 Convert Iterator to ArrayList 的可能重复项。 @ruakh 这个问题和这个问题有很多不同之处。这个处理Gson
。
@AbelMelquiadesCallejo 看看答案。希望它能解决您的问题。
***.com/a/55691694/470749 对我有帮助。 list.add(item.getAsString());
【参考方案1】:
绝对最简单的方法是使用 Gson 的默认解析函数fromJson()
。
当您需要反序列化为任何ParameterizedType
(例如,任何List
)时,该函数有一个实现,即fromJson(JsonElement json, Type typeOfT)
。
在您的情况下,您只需要获取List<String>
的Type
,然后将JSON 数组解析为Type
,如下所示:
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() .getType();
List<String> yourList = new Gson().fromJson(yourJson, listType);
在您的情况下,yourJson
是 JsonElement
,但它也可以是 String
、任何 Reader
或 JsonReader
。
您可能想看看Gson API documentation。
【讨论】:
Type
可以在什么包中找到?
Type
是一个Java内置接口,位于包java.lang.reflect
我必须使用getString()
而不是get()
否则.fromJson()
会抱怨。
@MikO 我和 Gson here 有类似的问题。我想看看你能不能帮帮我。我确实有一个解决方案,但问题是仅将 JSON 解析为 Map 看起来非常混乱。【参考方案2】:
以下代码使用com.google.gson.JsonArray
。
我已经打印了列表中元素的数量以及列表中的元素
import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class Test
static String str = " "+
"\"client\":\"127.0.0.1\"," +
"\"servers\":[" +
" \"8.8.8.8\"," +
" \"8.8.4.4\"," +
" \"156.154.70.1\"," +
" \"156.154.71.1\" " +
" ]" +
"";
public static void main(String[] args)
// TODO Auto-generated method stub
try
JsonParser jsonParser = new JsonParser();
JsonObject jo = (JsonObject)jsonParser.parse(str);
JsonArray jsonArr = jo.getAsJsonArray("servers");
//jsonArr.
Gson googleJson = new Gson();
ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
System.out.println("List size is : "+jsonObjList.size());
System.out.println("List Elements are : "+jsonObjList.toString());
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
输出
List size is : 4
List Elements are : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]
【讨论】:
【参考方案3】:我从Gson官方网站here阅读解决方案
这个代码给你:
String json = ""client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]";
JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
JsonArray jsonArray = jsonObject.getAsJsonArray("servers");
String[] arrName = new Gson().fromJson(jsonArray, String[].class);
List<String> lstName = new ArrayList<>();
lstName = Arrays.asList(arrName);
for (String str : lstName)
System.out.println(str);
结果显示在监视器上:
8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1
【讨论】:
和上面的答案一样——仍然使用静态方法new Gson().fromJson()
好吧,我的问题是其他问题,但您的 sn-p 解决了我的问题。我存储了字符串列表,但我想获取字符串。然后你的 sn-p 让我想起他们的我可以把 String[].class 来获取数据。谢谢【参考方案4】:
我只需要对所有字段使用@SerializedName
,就可以让列表映射工作。不需要Type
周围的逻辑。
运行代码 - 在下面的第 4 步中 - 通过调试器,我可以观察到 List<ContentImage> mGalleryImages
对象填充了 JSON 数据
这是一个例子:
1. JSON
"name": "Some House",
"gallery": [
"description": "Nice 300sqft. den.jpg",
"photo_url": "image/den.jpg"
,
"description": "Floor Plan",
"photo_url": "image/floor_plan.jpg"
]
2。带有 List 的 Java 类
public class FocusArea
@SerializedName("name")
private String mName;
@SerializedName("gallery")
private List<ContentImage> mGalleryImages;
3.列表项的 Java 类
public class ContentImage
@SerializedName("description")
private String mDescription;
@SerializedName("photo_url")
private String mPhotoUrl;
// getters/setters ..
4.处理 JSON 的 Java 代码
for (String key : focusAreaKeys)
JsonElement sectionElement = sectionsJsonObject.get(key);
FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
【讨论】:
我如何使用这种方式访问内容图像? @Adnanhaider,如果我理解你的问题,你想在查看器中实际加载图像吗?在此处的示例中,这就是图像 url 的用途。这是关于如何在 android ***.com/questions/5776851/load-image-from-url 中执行此操作的线程 我有两个类 1. 主要 2 列表形状类。 1个类作为父类,其属性是名称,id,地址,2个类子类,其中子类名称,类名,学校名称等现在在模型类中设置getter setter后,我从json mvvm方法获取数据,我想访问getter子类,我只访问父类而不是子类,这让我头疼了 2 天仍然没有找到答案。那么我如何访问已经作为 arraylist 的子类的属性。 @Adnanhaider,我之前没看到这条消息,今天才看到。这听起来像是一个不平凡的设置。我建议创建一个新帖子,并在干净的块中列出最少的代码,以演示您正在使用什么以及您希望它做什么【参考方案5】:假设您以mapping.get("servers").getAsJsonArray()
开头,如果您可以访问Guava Streams
,则可以执行以下单行:
List<String> servers = Streams.stream(jsonArray.iterator())
.map(je -> je.getAsString())
.collect(Collectors.toList());
注意StreamSupport
将无法在JsonElement
类型上工作,所以它是不够的。
【讨论】:
以上是关于使用 Gson 将 JSON 数组解析为 java.util.List的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gson 解析后将嵌套的 JSON 数组插入 SQLite
无法使用 Gson 将包含嵌套 json 数组的 json 转换为等效的 JAVA 类