如何在java中从json字符串(带子项)中删除特定keyname的所有键及其值

如何在java中从json字符串(带子项)中删除特定keyname的所有键及其值,java,json,string,Java,Json,String,我想从json字符串中删除所有键“id”及其值。问题是“id”在我的json字符串中有很多级别。我正在使用JSONObject。使用JSONObject,我们只能在顶层删除“id”,但我需要从每个层删除“id”。请帮帮我 json字符串的Ex- "{ "success": { "body": { "id": 5827, "siteName": "RPX", "instances": [

我想从json字符串中删除所有键“id”及其值。问题是“id”在我的json字符串中有很多级别。我正在使用JSONObject。使用JSONObject,我们只能在顶层删除“id”,但我需要从每个层删除“id”。请帮帮我

json字符串的Ex-

"{
    "success": {
        "body": {
            "id": 5827,
            "siteName": "RPX",
            "instances": [
                {
                    "instanceId": "i-3a63035e",
                    "name": "prdae-mst21a (iserver)",
                    "state": "running",
                    "publicDnsName": "ec2-54-209-175-118.compute-1.amazonaws.com",
                    "tags": [

                        {
                            "id": 9783,
                            "key": "ktier",
                            "value": "da"
                        },
                        {
                            "id": 9782,
                            "key": "Name",
                            "value": "prdae-mst21a (iserver)"
                        },
                        {
                            "id": 9781,
                            "key": "kreg",
                            "value": "e"
                        }
                    ],
                    "sshAccessInfo": {
                        "id": 9788,
                        "keyPair": {
                            "id": 6050,
                            "keyName": "Kens key",
                            "status": "UPLOADED",
                            "defaultUser": "root",
                            "passPhrase": "imaginea#@!"
                        },
                        "userName": "imaginea"
                    },
                    "account": {
                        "id": 5857,
                        "accountId": "348713271046",
                        "type": "AWS",
                        "ownerAlias": "348713271046",
                        "regionName": "us-east-1"
                    },
                    "availabilityZone": "us-east-1a",
                    "publicIpAddress": "54.209.175.118",
                    "instanceType": "m2.2xlarge"
                },
                {
                    "instanceId": "i-65ad2346",
                    "name": "prpoe-pap22e cp",
                    "state": "running",
                    "publicDnsName": "ec2-54-86-2-65.compute-1.amazonaws.com",
                    "tags": [
                        {
                            "id": 9755,
                            "key": "kzone",
                            "value": "e"
                        },
                        {
                            "id": 9754,
                            "key": "kreg",
                            "value": "e"
                        }
                    ],
                    "sshAccessInfo": {
                        "id": 9756,
                        "keyPair": {
                            "id": 5895,
                            "keyName": "rpxprod-rightscale",
                            "status": "UPLOADED",
                            "defaultUser": "ubuntu",
                            "passPhrase": "imaginea#@!"
                        },
                        "userName": "imaginea"
                    },
                    "account": {
                        "id": 5857,
                        "accountId": "348713271046",
                        "type": "AWS",
                        "ownerAlias": "348713271046",
                        "regionName": "us-east-1"
                    },
                    "availabilityZone": "us-east-1e",
                    "publicIpAddress": "54.86.2.65",
                    "instanceType": "m1.large"
                }  ],
            "filters": [
                {
                    "id": 5828,
                    "accountInfo": {
                        "id": 5829,
                        "type": "AWS",
                        "regionName": "us-east-1"
                    }
                }
            ],
            "loadBalancers": [
                {
                    "id": 5855,
                    "name": "st-pgpool-cp",
                    "vpcId": "vpc-865c68ee",
                    "instanceIds": [
                        "i-b81511eb"
                    ],
                    "availabilityZones": [
                        "us-east-1e"
                    ]
                },
                {
                    "id": 5850,
                    "name": "pr-pgpool-cp",
                    "vpcId": "vpc-865c68ee",
                    "instanceIds": [
                        "i-ed262988"
                    ],
                    "availabilityZones": [
                        "us-east-1d"
                    ]
                }
                {
                    "id": 5844,
                    "name": "qa2-api",
                    "vpcId": "vpc-865c68ee",
                    "instanceIds": [
                        "i-63687842"
                    ],
                    "availabilityZones": [
                        "us-east-1a"
                    ]
                },
                {
                    "id": 5830,
                    "name": "prod-portal-https-v31",
                    "vpcId": "vpc-865c68ee",
                    "instanceIds": [
                        "i-97509bfa",
                        "i-660f0408"
                    ],
                    "availabilityZones": [
                        "us-east-1e",
                        "us-east-1d"
                    ]
                }
            ]
        }
    }
}"

我想从
正文
实例
sshAccessInfo
过滤器
负载平衡器
等中删除
id
。请提供一种合适的方法

请测试以下代码段。应该会很高兴见到你

/**
 * @param args
 */
public static void main(String[] args) {
    String jsonStr ="{'id':'2839','body':{'id':'22',objs:[{id:1},{id:2}]}}";
    try {
        JSONObject obj = new JSONObject(jsonStr);
        removeJSONField(obj);

        System.out.println(obj);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public static void removeJSONField(JSONObject obj) throws JSONException{
    obj.remove("id");

    Iterator<String> it = obj.keys();
    while(it.hasNext()){
        String key = it.next();
        Object childObj = obj.get(key);
        if(childObj instanceof JSONArray){
            JSONArray arrayChildObjs =((JSONArray)childObj);
            int size = arrayChildObjs.length();
            for(int i=0;i<size;i++){
                removeJSONField(arrayChildObjs.getJSONObject(i));
            }
        }
        if(childObj instanceof JSONObject){
            removeJSONField(((JSONObject) childObj));

        }

    }
}
/**
*@param args
*/
公共静态void main(字符串[]args){
字符串jsonStr=“{id':'2839','body':{id':'22',objs:[{id:1},{id:2}]}”;
试一试{
JSONObject obj=新的JSONObject(jsonStr);
移除JSONFIELD(obj);
系统输出打印项次(obj);
}捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态void removeJSONField(JSONObject obj)抛出JSONException{
对象删除(“id”);
迭代器it=obj.keys();
while(it.hasNext()){
String key=it.next();
Object childObj=obj.get(key);
if(JSONArray的childObj实例){
JSONArray arrayChildObjs=((JSONArray)childObj);
int size=arrayChildObjs.length();

对于(inti=0;i请测试以下代码段。它应该很适合您

/**
 * @param args
 */
public static void main(String[] args) {
    String jsonStr ="{'id':'2839','body':{'id':'22',objs:[{id:1},{id:2}]}}";
    try {
        JSONObject obj = new JSONObject(jsonStr);
        removeJSONField(obj);

        System.out.println(obj);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public static void removeJSONField(JSONObject obj) throws JSONException{
    obj.remove("id");

    Iterator<String> it = obj.keys();
    while(it.hasNext()){
        String key = it.next();
        Object childObj = obj.get(key);
        if(childObj instanceof JSONArray){
            JSONArray arrayChildObjs =((JSONArray)childObj);
            int size = arrayChildObjs.length();
            for(int i=0;i<size;i++){
                removeJSONField(arrayChildObjs.getJSONObject(i));
            }
        }
        if(childObj instanceof JSONObject){
            removeJSONField(((JSONObject) childObj));

        }

    }
}
/**
*@param args
*/
公共静态void main(字符串[]args){
字符串jsonStr=“{id':'2839','body':{id':'22',objs:[{id:1},{id:2}]}”;
试一试{
JSONObject obj=新的JSONObject(jsonStr);
移除JSONFIELD(obj);
系统输出打印项次(obj);
}捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态void removeJSONField(JSONObject obj)抛出JSONException{
对象删除(“id”);
迭代器it=obj.keys();
while(it.hasNext()){
String key=it.next();
Object childObj=obj.get(key);
if(JSONArray的childObj实例){
JSONArray arrayChildObjs=((JSONArray)childObj);
int size=arrayChildObjs.length();

对于(int i=0;i第1步是将JSON字符串解析为一组对象。java有几个JSON库,它们并不很难使用。例如,使用JSON库,您可以执行以下操作:

  • 创建引用JSON字符串的
    StringReader
    ByteArrayInputStream
  • 调用
    Json.createReader()
    获取Json读取器
  • 调用
    JSONReader.read()
    JSONReader.readObject()
    将字符串解析为一组JSON对象
  • 根据需要修改JSON对象
  • 如果需要,创建一个JSON编写器并将JSON对象转换回字符串

  • 其他JSON库也会遵循类似的过程,尽管它们的特定类名可能不同。

    步骤1是将JSON字符串解析为一组对象。java有几个JSON库,它们并不很难使用。例如,使用JSON库,您可以执行以下操作:

  • 创建引用JSON字符串的
    StringReader
    ByteArrayInputStream
  • 调用
    Json.createReader()
    获取Json读取器
  • 调用
    JSONReader.read()
    JSONReader.readObject()
    将字符串解析为一组JSON对象
  • 根据需要修改JSON对象
  • 如果需要,创建一个JSON编写器并将JSON对象转换回字符串

  • 其他JSON库将遵循类似的过程,尽管它们的特定类名可能不同。

    不是很好,但如果它可以是真正的动态的,那么您可以使用regexp和
    replaceAll()
    在解析任何内容之前从JSON字符串中删除所需的键值:

    json = json.replaceAll("\"" + prop + "\"[ ]*:[^,}\\]]*[,]?", "")
    

    在您的例子中,
    String prop=“id”

    不是很好,但是如果它可以是真正的动态的,那么您可以使用regexp和
    replaceAll()
    在解析任何内容之前从JSON字符串中删除所需的键值:

    json = json.replaceAll("\"" + prop + "\"[ ]*:[^,}\\]]*[,]?", "")
    

    在您的例子中,
    String prop=“id”

    我的答案与@frank.zheng相同,只是我加入了一个if语句,在数组子对象尝试递归回函数之前检查它是否是对象

    public static void removeJSONField(JSONObject obj) throws JSONException{
        obj.remove("id");
    
        Iterator<String> it = obj.keys();
        while(it.hasNext()){
            String key = it.next();
            Object childObj = obj.get(key);
            if(childObj instanceof JSONArray){
                JSONArray arrayChildObjs =((JSONArray)childObj);
                int size = arrayChildObjs.length();
                for(int i=0;i<size;i++){
                    if (arrayChildObjs.get(i) instanceof JSONObject){
                        removeJSONField(arrayChildObjs.getJSONObject(i));
                    }
                }
            }
            if(childObj instanceof JSONObject){
                removeJSONField(((JSONObject) childObj));
    
            }
    
        }
    }
    
    publicstaticvoidremovejsonfield(jsonobjectobj)抛出JSONException{
    对象删除(“id”);
    迭代器it=obj.keys();
    while(it.hasNext()){
    String key=it.next();
    Object childObj=obj.get(key);
    if(JSONArray的childObj实例){
    JSONArray arrayChildObjs=((JSONArray)childObj);
    int size=arrayChildObjs.length();
    
    对于(int i=0;i我的答案与@frank.zheng相同,只是我加入了一个if语句,在数组子元素尝试递归回函数之前检查它是否是对象

    public static void removeJSONField(JSONObject obj) throws JSONException{
        obj.remove("id");
    
        Iterator<String> it = obj.keys();
        while(it.hasNext()){
            String key = it.next();
            Object childObj = obj.get(key);
            if(childObj instanceof JSONArray){
                JSONArray arrayChildObjs =((JSONArray)childObj);
                int size = arrayChildObjs.length();
                for(int i=0;i<size;i++){
                    if (arrayChildObjs.get(i) instanceof JSONObject){
                        removeJSONField(arrayChildObjs.getJSONObject(i));
                    }
                }
            }
            if(childObj instanceof JSONObject){
                removeJSONField(((JSONObject) childObj));
    
            }
    
        }
    }
    
    publicstaticvoidremovejsonfield(jsonobjectobj)抛出JSONException{
    对象删除(“id”);
    迭代器it=obj.keys();
    while(it.hasNext()){
    String key=it.next();
    Object childObj=obj.get(key);
    if(JSONArray的childObj实例){
    JSONArray arrayChildObjs=((JSONArray)childObj);
    int size=arrayChildObjs.length();
    
    对于(int i=0;i您是生成此JSON还是仅接收它?如果您已经能够删除一个键值对,那么递归遍历如何?Hello cy3er-我接收此JSON作为字符串参数。Hello Smutje-不知道如何递归遍历,因为此JSON是动态的。下次它可能包含“实例”和“站点名”只有。如果我理解错了,那么请用上面的字符串给出一个ex。假设json字符串存储在字符串objStr中。您是否生成了这个