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

时间:2014-08-14 12:10:18

标签: java json parsing

我想阅读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" ... 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

使用任何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+":)("[^"]*")

这是online demo

或尝试使用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
}