我想阅读json文件如下;
{
"M": {
"row": [
{
"col1": "c00"
},
{
"col1": "c10",
"col2": "c11"
},
{
"col1": "c20",
"col2": "c21",
"col3": "c22"
}
]
}
}
在阅读之后,我想打印" c00"," c10"," c11"," c20",&#34 ; C21"" C22"但是没有给出元素作为" col1"," col2"," col3" ... 谢谢你的帮助。
答案 0 :(得分:0)
使用任何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+":)("[^"]*")
或尝试使用Reluctant Qualifier
("col\d+":)(".*?")
这是demo
示例代码:
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);
}
}
}
答案 1 :(得分:0)
您可以使用org.json
库。它是here。总体思路:
JSONObject obj = new JSONObject(sourceString);
for(String key : obj.keys()){
String value = obj.getString(key);
// Process value here
}