2017-10-27 16 views
2

Java에서 많은 양의 데이터를 동적으로 구문 분석하려고합니다. 내가 String 또는 (GSON 통해) JSON 문자열에 이르렀 대신하고있는 중이 야, 그래서 다른 말로하면 나는 다른 타입의 데이터의 톤을 가지고JSON 구문 분석 또는 String 구문 분석이 Java에서 더 비쌉니까?

switch(data){ 
case instanceof Class1: 
    Class1 data = gson.fromJson(jsonString); 
    //Do Stuff for class 1 layout 
case instanceof Class2: 
    Class2 data = gson.fromJson(jsonString); 
etc. 

을 그래서 대신 (80 정도 클래스에 대해이 작업을 수행하는 더 많은 시간을 추가/제거/변경 가능) String 또는 Json String에 데이터를 넣고 값 (깊이 우선)을 파싱 할 계획입니다.

로우 엔드 PC (싱글 코어 Atom 프로세서)를 사용하고 있으며 CPU에 걸리는 부담을 줄이려고 노력하고 있으므로 어느 것이 더 빠를지 결정할 수 있습니다 ... 분할 또는 재귀 사용의 정규식 문자열 조작 JSON 파서.

+1

테스트 해 보셨습니까? – de1

+0

누군가가 머리 꼭대기에서 알거나 더 나은 제안을하면 이중 개발을 피하려고했습니다. – Tacitus86

답변

1

우리가 논의하자 모두 당신이 여기에 언급 한 경우 :

CASE 1 : 각각 GSON를 사용하여 모든 JSON 입력에 대한 인스턴스를 생성 는

(클래스 매핑) 사례 2 : 문서 (또는 유사한 유형의 개체) 자체를 만들고 거기에서 데이터에 액세스 해보십시오.

사례 2의 경우 이미 파서를 작성할 필요가 없습니다. 이미 사용할 수있는 파서가 있습니다. 난 그냥 (물론 GSON 사용할 유사한 물건이 있어야합니다) 여기에 잭슨 예를 쓸 것이다 : 내 경험으로 당

String myJson = "{ \"type\" : \"foo\", \"class\" : 3 }"; 
ObjectMapper objectMapper = new ObjectMapper(); 
JsonNode node = objectMapper.readValue(myJson, JsonNode.class); 
JsonNode type = node.get("type"); 
System.out.println(type.asText()); 

는 성능 차이가 이러한 경우 모두에서 많은되지 않았습니다 라이브러리는 구문 분석을 매우 효율적으로 처리하지만 JSON 유형이 많으면 각 JSON에서 POJO를 만드는 것이 의미가 없습니다 (많은 매핑 !!).

나는 개인적으로 this과 같은 성능상의 이유 때문에 gson을 사용하지는 않았지만 jackson을 사용하여 ObjectMapper라고 불리는 것을 만들 수 있으며 매우 효율적으로 사용할 수 있습니다. 나는 gson에도 비슷한 것이 있어야한다고 가정한다.

유일한 단점은 문자열 입력을 통해 모든 필드에 액세스 할 수 있으므로 코드를 읽을 수 없게되는 것입니다.

편집 :

당신이 정말로 JSON의 모든 필드를 반복하려면, 당신은 궁극적으로 DFS를해야 할 것이다, 그러나 해석은 여전히 ​​JsonNode의 fields 방법을 사용하여 피할 수 있습니다.

root.fields()은 답변이 here에 설명 된대로 정상적으로 사용할 수있는 항목이있는 반복자와 함께 반환됩니다.

gson에서도 비슷한 이름의 다른 이름을 사용할 수 있습니다. :)

+0

각 클래스 유형의 인스턴스를 만들어야합니다. JSON의 키를 알아야합니다. 나는 아무것도 알지 못하는 JSON 문자열을 얻고있다. 나는 그것을 처리하고 싶다. – Tacitus86

+0

취급하는 동안 열쇠를 알아야합니까? ObjectMapper (jackson의 팬이 아니지만 gson이 작동하는 방식을 모른다면)을 사용하면 JSON 구조가 변경 될 수 있으므로 클래스를 선언 할 필요가 없습니다. 모든 새로운 JSON에 대해 클래스를 만들 수 없으며 문제를 일으키는 것으로 생각됩니다. 또한 노드, 값, 배열 등을 실제로 반복 할 수 있으며 기본적으로 JSON 구조에 엄격함이 없어도 객체에 액세스 할 수 있습니다 (더 이상 클래스에 매핑 할 필요 없음). –

+0

모든 노드를 살펴보고 싶으면 fields() iterator를 btw ..와 같이 사용할 수 있습니다. 자바로 JSON을 다루는 것은 어렵다. –