Jackson을 사용하여 JSON 요소 제거
Import org.codehouse.jackson에 대응하는 특정 JSON 노드가 있습니다.Import org.codehouse.jackson.map이 아닌 JsonNode.Json Node.
[
{
"givenName": "Jim",
"formattedName": "jimJackson",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "john",
"formattedName": "johnLasher",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "carlos",
"formattedName": "carlosAddner",
"familyName": null,
"middleName": "none",
"honorifiPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "lisa",
"formattedName": "lisaRay",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mrs",
"honorificSuffix": "none"
},
{
"givenName": "bradshaw",
"formattedName": "bradshawLion",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "phill",
"formattedName": "phillKane",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "Gabriel",
"formattedName": "gabrielMoosa",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
}
]
위의 어레이의 모든 JSON 노드에서 "familyName"과 "middleName"을 삭제합니다.이것을 달성할 수 있는 방법이 있나요?
테스트해 본 적은 없지만, 이런 게 당신이 원하는 대로 될 것 같아요.
import org.codehaus.jackson.node.ObjectNode;
// ...
for (JsonNode personNode : rootNode) {
if (personNode instanceof ObjectNode) {
ObjectNode object = (ObjectNode) personNode;
object.remove("familyName");
object.remove("middleName");
}
}
Jackon의 raw parsing API를 사용하여 보다 효율적으로 실행할 수도 있지만, 코드는 훨씬 복잡합니다.
잭슨의 Object Mapper는 몇 가지 절차만으로 솔루션을 제공합니다.
json 데이터를 'data.json' 파일에 저장합니다.코드를 따라 Import 문이 없는 함수로 복사하고 함수를 호출합니다.생성된 JSON은 새 파일 'data1.json'에 기록됩니다.
import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(new File("data.json"));
for (JsonNode node : jsonNode) {
((ObjectNode)node).remove("familyName");
((ObjectNode)node).remove("middleName");
}
objectMapper.writeValue(new File("data1.json"), jsonNode);
최근에 이 질문을 하게 된 이유는 다음과 같은 요소를 제거해야 하는 특이한 JSON이 있었기 때문입니다.
{
"allan": { "score": 88 },
"bill": { "score": 75 },
"cassie": { "score": 96 },
"warnings": [ { "name": "class_low_numbers", "message": "this class is has less than 10 students" }]
}
처음 세 가지 요소는 개인과 각 점수 개체를 나타냅니다.마지막 "경고"가 점수 개체와 일치하지 않았으며, 이 개체를 삭제하려고 했습니다.
위의 gsteff의 답변에서 rootNode를 시작 JsonNode로 간주하여 이를 삭제하는 방법은 각 노드를 통해 반복하고 HashMap에 노드 매핑버전을 추가하는 것입니다.HashMap은 "warnings" 요소가 아닌 한 원하는 반환 객체입니다.
HashMap<String, ScoreDetails> results = new HashMap<String, ScoreDetails>();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> next = fields.next();
if (!next.getKey().equals("warnings")) {
results.put(
next.getKey(), mapper.treeToValue(next.getValue(), ScoreDetails.class));
}
}
return results;
gsteff가 쓴 답변도 사용할 수 있지만, JsonNode가 아닌 오브젝트 맵퍼를 사용하여 JSONArray로 변환하고 거기에서 가는 것이 더 쉬운 방법이라고 생각했습니다.
ObjectMapper mapper = new ObjectMapper();
String stringJsonArray = mapper.writeValueAsString(list);
JSONArray csvDatabindedtoBean = new JSONArray(stringJsonArray);
JSONArray finalArray = new JSONArray();
for (int val = 0; val < csvDatabindedtoBean.length(); val++) {
JSONObject finalObject = csvDatabindedtoBean.getJSONObject(val);
finalObject.remove("familyName");
finalObject.remove("middleName");
}
finalArray.put(finalObject);
}
JSONObject 매뉴얼에 따르면 JSONObject는 Map.remove를 구현하여 해당 키에 저장된 값을 반환합니다.사용법
JSONObject json = new JSONObject();
json.put("key", "value");
String str = (String)json.remove("key");
필요한 것은 특정 프레픽스를 가진 키를 가진 플랫루트 오브젝트에서 요소를 삭제하는 것이었습니다.저의 해결책은 다음과 같습니다.
Iterator<String> it = jsonNode.fieldNames();
while (it.hasNext()) {
String nextKey = it.next();
if (nextKey.startsWith("prefix")) {
it.remove();
((ObjectNode)jsonNode).remove(nextKey);
}
}
또한 반복기에서 요소를 제거해야 합니다. 그렇지 않으면 Concurrent Access 유형의 예외가 발생합니다.
새 JSONObject를 만들고 "familyName" 및 "middleName"을 제외한 모든 노드를 읽은 다음 새 파일에 저장할 수 있습니다.여기 예가 있습니다.JSON. 심플한 예– JSON 읽기 및 쓰기
언급URL : https://stackoverflow.com/questions/15603033/removing-json-elements-with-jackson
'source' 카테고리의 다른 글
워드프레스 위젯을 프로그래밍 방식으로 표시하는 방법 (0) | 2023.03.20 |
---|---|
AngularJS에서의 스테이트풀필터링이란? (0) | 2023.03.20 |
react hooks useEffect() 청소는 componentWillUnmount만 해당합니까? (0) | 2023.03.20 |
컬을 사용하여 배열이 있는 json 객체를 배치하는 방법 (0) | 2023.03.15 |
이력 푸시와 치환의 트레이드오프는 무엇입니까? (0) | 2023.03.15 |