[英]How to Read Json File Without Giving Element Names in Java
我想按以下方式读取json文件;
{
"M": {
"row": [
{
"col1": "c00"
},
{
"col1": "c10",
"col2": "c11"
},
{
"col1": "c20",
"col2": "c21",
"col3": "c22"
}
]
}
}
在阅读旁边,我要打印“ c00”,“ c10”,“ c11”,“ c20”,“ c21”,“ c22”,但不将元素指定为“ col1”,“ col2”,“ col3” ...感谢您的帮助。
使用任何JSON解析库(例如GSON或Jackson) ,并将其转换为Java Object。
使用GSON库的示例代码
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> data = new Gson().fromJson(jsonString, type);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
// get the desired value from map
Map<String,ArrayList<Map<String,String>>> mMap=(Map<String,ArrayList<Map<String,String>>>)data.get("M");
ArrayList<Map<String,String>> rowArray=mMap.get("row");
for(Map<String,String> colMap:rowArray){
for(String value:colMap.values()){
System.out.println(value);
}
}
您也可以将JSON字符串转换为Java POJO类,它是JSON字符串的副本
class MDetails {
private MDetail M;
// getter & setter
}
class MDetail {
private ArrayList<Map<String, String>> row;
// getter & setter
}
...
MDetails data = new Gson().fromJson(jsonString, MDetails.class);
for (Map<String, String> colMap : data.getM().getRow()) {
for (String value : colMap.values()) {
System.out.println(value);
}
}
您可以使用@SerializedName
批注使用其他字段名称。
class MDetails {
@SerializedName("M")
private MDetail mDetail;
// getter & setter
}
根据注释,键是动态的,因此要迭代其中包含另一个映射的映射,并打印其键以col
开头的所有值
示例代码:(以下调用该方法以递归方式迭代所有键和值)
public static void printColValues(Object data) {
if (data instanceof Map) {
for (Map.Entry<String, Object> entry : ((Map<String, Object>) data).entrySet()) {
String key = entry.getKey();
if (key.startsWith("col")) {
System.out.println(entry.getValue());
} else {
printColValues(entry.getValue());
}
}
} else if (data instanceof List) {
for (Object obj : (List) data) {
printColValues(obj);
}
}
}
输出:
c00
c10
c11
c20
c21
c22
或者,如果没有任何效果,则尝试使用正则表达式模式,但将其保留为最后的选择
("col\d+":)("[^"]*")
这是在线演示
或尝试勉强的限定词
("col\d+":)(".*?")
这是演示
样例代码:
String jsonString = "{\"M\":{\"row\":[{\"col1\":\"c00\"},{\"col1\":\"c10\",\"col2\":\"c11\"},{\"col1\":\"c20\",\"col2\":\"c21\",\"col3\":\"c22\"}]}}";
Pattern p = Pattern.compile("(\"col\\d+\":)(\"[^\"]*\")");
Matcher m = p.matcher(jsonString);
while (m.find()) {
System.out.println(m.group(2));
}
输出:
"c00"
"c10"
"c11"
"c20"
"c21"
"c22"
更新代码以打印所有值,而与键无关
public static void printColValues(Object data) {
if (data instanceof Map) {
for (Map.Entry<String, Object> entry : ((Map<String, Object>) data).entrySet()) {
Object value=entry.getValue();
if (value instanceof String) {
System.out.println(value);
} else {
printColValues(value);
}
}
} else if (data instanceof List) {
for (Object obj : (List) data) {
printColValues(obj);
}
}
}
您可以为此使用org.json
库。 在这里 。 大概的概念:
JSONObject obj = new JSONObject(sourceString);
for(String key : obj.keys()){
String value = obj.getString(key);
// Process value here
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.