繁体   English   中英

如何在不提供Java元素名称的情况下读取Json文件

[英]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解析库(例如GSONJackson) ,并将其转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM