如何在java

时间:2015-12-14 04:56:00

标签: java json gson

我尝试过以下示例。

public static void operate2(JsonElement jsonElement, List keys, JsonElement jsonElement2, String prefix){
String prefixnew = "";
if(jsonElement.isJsonArray()){

    JsonArray jsonArray = jsonElement.getAsJsonArray();

     for(int i=0; i<jsonArray.size(); i++){

         jsonElement = jsonArray.get(i);
         operate2(jsonElement, keys, jsonElement2, prefix);
     }

}else if(jsonElement.isJsonObject()){
     JsonObject jsonObject = jsonElement.getAsJsonObject();
     Set<Map.Entry<String,JsonElement>> childEntrySet = jsonObject.entrySet();


     for (Map.Entry<String, JsonElement> child: childEntrySet) {


         jsonElement2 = child.getValue();

         Object keyCheck = new Gson().fromJson(jsonElement2.toString(), Object.class);
         if (keyCheck instanceof Map) {
             prefix += child.getKey()+"_";
             keys.add(prefix);
             System.out.println("Map="+child.getKey());
         }else if (keyCheck instanceof Collection) {
             if(!prefix.equals("")){
                 prefix += child.getKey()+"_";
                 keys.add(prefix);
             }else{

                 prefix = child.getKey()+"_";
                 keys.add(prefix);
             }

             System.out.println("Collection="+child.getKey());

         }else{

             prefix += "";
         }
         operate2(jsonElement2, keys, jsonElement2, prefix);
     }

}else{
    prefix = "";
}

}

public static void test2(String json){


JsonElement jsonElement = new JsonParser().parse(json);
JsonElement jsonElement2 = null;
String prefix = "";
List keys = new ArrayList();
operate2(jsonElement, keys, jsonElement2, prefix);

Set keySet = new HashSet(keys);
System.out.println("Keys = "+keys);

}

我得到的输出Keys = [items_,items_contact_,items_contact_records_,items_contact_records_recordings_,items_contact2 _]

但是我需要items_,items_contact_,items_records_ ....我们可以看到记录不是联系人的孩子,所以items_contact_records_不应该在那里。而应该是items_records_。

源json将是

{
"items": [{
    "id": 633706061003,
    "fromNumber": "16572307534",

 "contact": {
     "id": 499354453003,
     "homePhone": "16572307534"
 },

"records": [{
    "id": 353389055003,
    "result": "LA",
    "recordings": [{
       "id": 16427622003
    }]
  }]
}],
"limit": 100,
"offset": 0,
"totalCount": 5949
}

1 个答案:

答案 0 :(得分:1)

我会使用以下方法:

  • 如果根元素不是json对象,则返回空列表
  • 否则迭代其他条目,并且如果与之关联的值是对象或数组,则为每个条目添加密钥
  • 以递归方式处理值
public static List<String> operate(final JsonElement jsonElement, final String prefix, final boolean firstLayer) {
    if(jsonElement.isJsonObject() || (!firstLayer && jsonElement.isJsonArray())) {
        List<String> keys = new ArrayList<>();
        if(jsonElement.isJsonObject()) {
            JsonObject jObj = jsonElement.getAsJsonObject();
            for(Map.Entry<String, JsonElement> entry : jObj.entrySet()) {
                JsonElement value = entry.getValue();
                String newPrefix = prefix + entry.getKey();
                if(value.isJsonArray() || value.isJsonObject()) {
                    keys.add(newPrefix);
                    keys.addAll(operate(value, newPrefix + "_", false));
                }
            }
        } else {
            JsonArray array = jsonElement.getAsJsonArray();
            for(JsonElement element : array) {
                keys.addAll(operate(element, prefix, false));
            }
        }
        return keys;
    } else {
        return Collections.emptyList();
    }
}

test方法:

public static void test(String json) {
    JsonElement jsonElement = new JsonParser().parse(json);
    List<String> keys = operate(jsonElement, "", true);
    System.out.println("Keys = " + keys);
}

在你的例子上运行它,你会得到:

Keys = [items, items_contact, items_records, items_records_recordings]