繁体   English   中英

如何返回在 java 中具有特定值的 json object?

[英]How to return json object having particular value in java?

这就是我作为 json 所拥有的,我在这里有一个条件可以忽略具有 object_name:[parent] 的 object,我尝试了一些没有成功的东西,有人可以帮助我吗?

    [
  {
    "object_group": "Trans",
    "permission_values": [
      {
        "object_type": "Trans",
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Invoice"
        ]
      },
      {
        "object_type": "Trans",
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "parent"
        ]
      }
    ]
  },
  {
    "object_group": "General",
    "permission_values": [
      {
        "object_type": "General",
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Customer"
        ]
      },
      {
        "object_type": "General",
        "permission_type": [
          {
            "Delete": true
          }
        ],
        "object_name": [
          "Product"
        ]
      }
    ]
  }
]

这是我尝试过的实际事情,因为我在这里有一个条件可以忽略具有 object_name:[parent] 的 object

 import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.json.JSONArray;
import org.json.JSONObject;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class TestData {

    public static void main(String[] args) throws JsonMappingException, JsonProcessingException {

         String input = "{\"JSON_OBJECT\":[{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Invoice\"]},{\"object_type\":\"General\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Customer\"]},{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Payments\"]},{\"object_type\":\"General\",\"permission_type\":[{\"Delete\":true}],\"object_name\":[\"Product\"]}]}";
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(input);
            Iterator<JsonNode> jsonObject = jsonNode.get("JSON_OBJECT").iterator();
            ObjectNode objectNode = objectMapper.createObjectNode();

            while (jsonObject.hasNext()) {
                JsonNode node = jsonObject.next();
                String object_type = node.path("object_type").asText();
                if (objectNode.has(object_type)) {
                    JsonNode objectTypeNode = objectNode.get(object_type);
                    JsonNode permission_values = objectTypeNode.path("permission_values");
                    if (!permission_values.isMissingNode()) {
                        ObjectNode permissionNode = objectMapper.createObjectNode();
                        node.fields().forEachRemaining(kv -> permissionNode.set(kv.getKey(),kv.getValue()));
                        ((ArrayNode) permission_values).add(permissionNode);
                    } else {
                        ObjectNode permissionNode = objectMapper.createObjectNode();
                        node.fields().forEachRemaining(kv -> permissionNode.set(kv.getKey(),kv.getValue()));
                        ((ArrayNode) permission_values).add(permissionNode);
                    }
                } else {
                    ArrayNode permissionArrayNode = objectMapper.createArrayNode();
                    ObjectNode permissionNode = objectMapper.createObjectNode();
                    node.fields().forEachRemaining(kv -> permissionNode.set(kv.getKey(),kv.getValue()));
                    permissionArrayNode.add(permissionNode);
                    ObjectNode permNode = objectMapper.createObjectNode();
                    permNode.set("permission_values", permissionArrayNode);
                    objectNode.set(object_type, permNode);
                }
            }
            ArrayNode arrayNode = objectMapper.createArrayNode();
            objectNode.fieldNames().forEachRemaining(key ->{
                ObjectNode node = objectMapper.createObjectNode();
                node.put("object_group",key);
                objectNode.get(key).fields().forEachRemaining(kv -> node.set(kv.getKey(),kv.getValue()));
                arrayNode.add(node);
            });
            System.out.println(arrayNode.toString());
    }
}

预期 output:- 有人可以帮我得到这个 output ..

[
  {
    "object_group": "Trans",
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Invoice"
        ]
      }
    ]
  },
  {
    "object_group": "General",
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Customer"
        ]
      },
      {
        "permission_type": [
          {
            "Delete": true
          }
        ],
        "object_name": [
          "Product"
        ]
      }
    ]
  }
]

我认为您的方法从根本上来说有点错误,如果您使用gson 库来获取对象,一旦启动就可以轻松获得所需的值,这会更好。

我建议使用此工具也可以轻松获得 gson 表示法中的 POJO object。

示例从该工具生成了三个类:

-----------------------------------com.example.JsonObject.java-----------------------------------

package com.example;

import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class JsonObject {

@SerializedName("object_type")
@Expose
private String objectType;
@SerializedName("permission_type")
@Expose
private List<PermissionType> permissionType = null;
@SerializedName("object_name")
@Expose
private List<String> objectName = null;

public String getObjectType() {
return objectType;
}

public void setObjectType(String objectType) {
this.objectType = objectType;
}

public List<PermissionType> getPermissionType() {
return permissionType;
}

public void setPermissionType(List<PermissionType> permissionType) {
this.permissionType = permissionType;
}

public List<String> getObjectName() {
return objectName;
}

public void setObjectName(List<String> objectName) {
this.objectName = objectName;
}

}
-----------------------------------com.example.MyClass.java-----------------------------------

package com.example;

import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class MyClass {

@SerializedName("JSON_OBJECT")
@Expose
private List<JsonObject> jsonObject = null;

public List<JsonObject> getJsonObject() {
return jsonObject;
}

public void setJsonObject(List<JsonObject> jsonObject) {
this.jsonObject = jsonObject;
}

}

-----------------------------------com.example.PermissionType.java-----------------------------------

package com.example;

import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class PermissionType {

@SerializedName("View")
@Expose
private Boolean view;
@SerializedName("Delete")
@Expose
private Boolean delete;

public Boolean getView() {
return view;
}

public void setView(Boolean view) {
this.view = view;
}

public Boolean getDelete() {
return delete;
}

public void setDelete(Boolean delete) {
this.delete = delete;
}

}

因此,当您从 REST/Api 方法中获取响应数组时,您可以简单地执行以下操作:

...
..
.
JSONObject responseObject = resObj.getJSONObject("whole_response_api");

     
     Type listType = new TypeToken<MyClass>() {
     }.getType();
     MyClass javaObject = gson.fromJson(responseObject.toString(), listType));

     String objectTypeOf1st = javaObject.getJsonObject(1).getObjectType();

...
..
.

注意:没有编译这个,所以语法我们可以解决,但我希望你能理解我的意思。

编辑: CodingInFlow 的这个视频解释了反序列化和序列化的概念,如果你想看一看,它会很精彩。

如果您不想创建 POJO,则必须使用通用的 json object 或 Map。 我使用 Jackson 库来获取 output。 请查看这是否是您想要的。 由于预期 output 不是正确的 json,因此我进行了修改以低于 output。

    String input = "{\"JSON_OBJECT\":[{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Invoice\"]},{\"object_type\":\"General\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Customer\"]},{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Payments\"]},{\"object_type\":\"General\",\"permission_type\":[{\"Delete\":true}],\"object_name\":[\"Product\"]}]}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(input);
    Iterator<JsonNode> jsonObject = jsonNode.get("JSON_OBJECT").iterator();
    ObjectNode objectNode = objectMapper.createObjectNode();

                while (jsonObject.hasNext()) {
            JsonNode node = jsonObject.next();
            String object_type = node.path("object_type").asText();
            if (objectNode.has(object_type)) {
                JsonNode objectTypeNode = objectNode.get(object_type);
                JsonNode permission_values = objectTypeNode.path("permission_values");
                if (!permission_values.isMissingNode()) {
                    ObjectNode permissionNode = objectMapper.createObjectNode();
                    node.fields().forEachRemaining(kv -> addIfRequired(permissionNode, kv));
                    ((ArrayNode) permission_values).add(permissionNode);
                } else {
                    ObjectNode permissionNode = objectMapper.createObjectNode();
                    node.fields().forEachRemaining(kv -> addIfRequired(permissionNode, kv));
                    ((ArrayNode) permission_values).add(permissionNode);
                }
            } else {
                ArrayNode permissionArrayNode = objectMapper.createArrayNode();
                ObjectNode permissionNode = objectMapper.createObjectNode();
                node.fields().forEachRemaining(kv -> addIfRequired(permissionNode, kv));
                permissionArrayNode.add(permissionNode);
                ObjectNode permNode = objectMapper.createObjectNode();
                permNode.set("permission_values", permissionArrayNode);
                objectNode.set(object_type, permNode);
            }
        }

    System.out.println(objectNode.toString());

编辑 3

private static void addIfRequired(ObjectNode permissionNode, Map.Entry<String, JsonNode> kv) {
    if (!("object_name".equalsIgnoreCase(kv.getKey()) && kv.getValue().get(0).asText().toLowerCase().contains("parent"))) {
        permissionNode.set(kv.getKey(), kv.getValue());
    }
}

//输出

{
  "Trans": {
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Invoice"
        ]
      },
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Payments"
        ]
      }
    ]
  },
  "General": {
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Customer"
        ]
      },
      {
        "permission_type": [
          {
            "Delete": true
          }
        ],
        "object_name": [
          "Product"
        ]
      }
    ]
  }
}

编辑:假设您需要数组为 output

    ArrayNode arrayNode = objectMapper.createArrayNode();
    objectNode.fieldNames().forEachRemaining(key ->{
        ObjectNode node = objectMapper.createObjectNode();
        node.put("object_group",key);
        objectNode.get(key).fields().forEachRemaining(kv -> node.set(kv.getKey(),kv.getValue()));
        arrayNode.add(node);
    });
    System.out.println(arrayNode.toString());

//输出

[
  {
    "object_group": "Trans",
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Invoice"
        ]
      },
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Payments"
        ]
      }
    ]
  },
  {
    "object_group": "General",
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Customer"
        ]
      },
      {
        "permission_type": [
          {
            "Delete": true
          }
        ],
        "object_name": [
          "Product"
        ]
      }
    ]
  }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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