2016-11-23 1 views
1

나는 만든 사용자 지정 규칙을 따르는 json 스키마 파일을 가지고 있습니다. 이 스키마 파일은 유효한 json 파일입니다. 그것은 아래의 패턴을 따른다.json 파일에서 미리 정의 된 스키마 속성을 찾는 가장 좋은 방법

{ 
    "name": { 
       "fname" : { 
          "displayName":"FirstName", 
          "dataType":"String" 
          } 
       "lname" : { 
          "displayName":"LastName", 
          "dataType":"String" 
          } 
       }, 
    "address": { 
        "displayName":"Address", 
        "dataType":"String" 
       } 
    } 

그래서 나는 아래의 json을 각각의 값으로 생성해야합니다.

{ 
     "name": { 
       "FirstName": "test", 
       "LastName" : "test1" 
       }, 
     "Address" : "someAddress" 
    } 

그래서 스키마를 가져 오면 구성 정보 노드를 찾는 가장 좋은 방법은 무엇입니까? 이는 displayName 및 dataType 매개 변수가있는 리프 노드입니다. 현재 JacksonJson을 사용하고 displayName 및 dataType 키가있는 노드를 찾는이 트리를 가로 지르고 있습니다. 왜냐하면이 리프 노드가 어느 레벨에 존재할 수 있는지 정확하게 말할 수 없기 때문입니다. 엘리먼트를 찾는 전체 json 트리를 가로 지르는 것보다이 상황을 처리하는 더 좋은 방법이 있습니까?

답변

1

나는 정확하게 (당신이 fname 객체 또는 그 속성의 값을 원합니까?) 확실하지 않았습니다. 그러나 여기서는 JsonPath이 적합하다고 생각됩니다. json에 대한 xpath와 동일합니다 - 다양한 기준에 기반한 검색 계층 모델

시작하기 위해 데모를 만들었습니다. 당신은 단지 귀하의 요구 사항에 맞게 쿼리 문자열을 twaek해야합니다. 코멘트에서 질문에 대한 답 :

경로의 존재를 확인 할 수 있습니다 (그리고하는 모든 종류의 당신은이 Jayway JsonPath Evaluator REPL로

import java.nio.file.*; 
import com.jayway.jsonpath.*; 
public class JsonPathDemo 
{ 
    public static void main(String[] args) 
    { 
     // query: get all json objects that have displayName and dataType properties 
     String jsonPathQuery = "$..*[?(@.displayName && @.dataType)]"; 
     try { 
      String content = new String(Files.readAllBytes(Paths.get("C://temp/xx.json"))); 
      Object parsedContent = Configuration.defaultConfiguration().jsonProvider().parse(content); 
      Object configElements = JsonPath.read(parsedContent, jsonPathQuery); 
      System.out.println(configElements.getClass()); 
      System.out.println(configElements); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

출력

class net.minidev.json.JSONArray 
[{"displayName":"Address","dataType":"String"},{"displayName":"FirstName","dataType":"String"},{"displayName":"LastName","dataType":"String"}] 

EDIT입니다 사용할 수 있습니다 다른 어설트 중) :

import static com.jayway.jsonpath.matchers.JsonPathMatchers.*; 

// query for specific path 
String jsonSpecificPathQuery = "$..name.fname.displayName"; 

String content = new String(Files.readAllBytes(Paths.get("C://temp/xx.json"))); 
Object parsedContent = Configuration.defaultConfiguration().jsonProvider().parse(content); 
System.out.println("hasJsonPath? " + hasJsonPath(jsonSpecificPathQuery).matches(parsedContent)); 
+0

경로가 configElements 객체로 읽는 대신 키 값에 존재하는지 확인하는 방법이 있습니까? – mayooran

+0

감사합니다. :) – mayooran

+0

문서에서 찾을 수 없습니다. 어디서 찾았 니? – mayooran