Gson을 사용하여 json 객체가 하나의 요소가있는 배열 값을 갖도록 강제하려고합니다. 이 방식으로 json을 구성하지만 JsonParser는 길이 1의 배열 대신 새 JsonObject를 만듭니다. 내 시스템에서 대부분의 json은 길이 1보다 큰 배열 값을 가지며 올바르게 구문 분석됩니다.
나는 JsonObject를 JsonArray에 강제로 강제하는 유틸리티 메서드를 시도하는 동안 이것을 발견했습니다. 예상대로 작동하지 않습니다.
static JsonArray bruteForceJsonArray(JsonObject object, String key) {
if(object.get(key).isJsonArray()) {
return object.get(key).getAsJsonArray();
} else {
System.out.println("broken: " + object.toString());
JsonObject temp = object.get(key).getAsJsonObject();
String fixed = "{'" + key + "':[" + temp.toString() + "]}";
System.out.println("pre-fix: " + fixed);
//parsing here reduces the array to an object - hot to prevent?
temp = new JsonParser().parse(fixed).getAsJsonObject();
System.out.println("fixed: " + object.toString());
return object.get(key).getAsJsonArray();
}
}
산출:
broken: {"token":{"NER":"O","id":1.0,"word":".","CharacterOffsetEnd":765.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":764.0}}
pre-fix: {'token':[{"NER":"O","id":1.0,"word":".","CharacterOffsetEnd":765.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":764.0}]}
fixed: {"token":{"NER":"O","id":1.0,"word":".","CharacterOffsetEnd":765.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":764.0}}
시스템에서 올바르게 나타나는 대부분의 json의 예 :
{"token":[{"Speaker":"PER0","POS":"IN","lemma":"except","CharacterOffsetBegin":742.0,"NER":"O","id":1.0,"word":"Except","CharacterOffsetEnd":748.0},{"CharacterOffsetEnd":752.0,"Speaker":"PER0","POS":"IN","lemma":"for","CharacterOffsetBegin":749.0,"NER":"O","id":2.0,"word":"for"},{"id":3.0,"word":"extra","CharacterOffsetEnd":758.0,"Speaker":"PER0","POS":"JJ","lemma":"extra","CharacterOffsetBegin":753.0,"NER":"O"},{"Speaker":"PER0","POS":"NN","lemma":"meat","CharacterOffsetBegin":759.0,"NER":"O","id":4.0,"word":"meat","CharacterOffsetEnd":763.0},{"CharacterOffsetEnd":764.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":763.0,"NER":"O","id":5.0,"word":"."}]}
이 문제를 해결하는 영리한 방법이 있습니까? 너무 많은 try / catch 또는 if / else 처리없이 스트림에서 개체를 처리 할 수 있도록 개체를 배열에 효과적으로 강제 할 수있는 방법이 있습니까?
static JsonArray bruteForceJsonArray(JsonObject object, String key) {
if (object.get(key).isJsonArray()) {
return object.get(key).getAsJsonArray();
} else {
JsonArray oneElementArray = new JsonArray();
oneElementArray.add(new JsonObject());
return oneElementArray;
}
}
그러나 JsonObject
/ JsonArray
직접 작업해서는 안됩니다 . 데이터에 대한 POJO 클래스를 만들고 Gson을 사용하여 JSON을 역 직렬화합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다