如何 return json 对象在 java 中具有特定值?
How to return json object having particular value in java?
这就是我作为 json 所拥有的,我在这里有一个条件可以忽略具有 object_name:[parent] 的对象,我已经尝试了一些没有解决的问题有人可以帮忙吗我也一样
[
{
"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]
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());
}
}
预期输出:-
有人可以帮我得到这个输出..
[
{
"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 library 来获取对象,你可以在启动后轻松获得所需的值会更好。
我建议使用 this tool 来轻松获取 gson 表示法中的 POJO 对象。
示例从工具生成了三个 类:
-----------------------------------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();
...
..
.
注意:没有编译这个,所以语法我们可以偏离,但我希望你能理解我的意思。
编辑:This video by CodingInFlow 很好地解释了反序列化和序列化的概念,如果您想看一看。
如果不想创建 POJO,则必须使用一般 json 对象或 Map。
我使用 Jackson 库来获取输出。请参阅这是否是您想要的。
由于预期的输出不是正确的 json,我已修改为低于输出。
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"
]
}
]
}
}
编辑:假设您需要数组作为输出
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"
]
}
]
}
]
这就是我作为 json 所拥有的,我在这里有一个条件可以忽略具有 object_name:[parent] 的对象,我已经尝试了一些没有解决的问题有人可以帮忙吗我也一样
[
{
"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]
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());
}
}
预期输出:- 有人可以帮我得到这个输出..
[
{
"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 library 来获取对象,你可以在启动后轻松获得所需的值会更好。
我建议使用 this tool 来轻松获取 gson 表示法中的 POJO 对象。
示例从工具生成了三个 类:
-----------------------------------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();
...
..
.
注意:没有编译这个,所以语法我们可以偏离,但我希望你能理解我的意思。
编辑:This video by CodingInFlow 很好地解释了反序列化和序列化的概念,如果您想看一看。
如果不想创建 POJO,则必须使用一般 json 对象或 Map。 我使用 Jackson 库来获取输出。请参阅这是否是您想要的。 由于预期的输出不是正确的 json,我已修改为低于输出。
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"
]
}
]
}
}
编辑:假设您需要数组作为输出
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"
]
}
]
}
]