2014-09-29 7 views
2

일부 구성을 통해 json 속성을 Java 객체 속성에 매핑하는 Java 객체 파서에 대한 사용자 정의 JSON이 있습니까? json에서 Java 객체 사용자 정의 파서

내가 클래스

class Person { String id; String name; String loc;} 

내 JSON 문자열 내가 Personloc 속성에 JSON의 location.address지도가 필요

{name:"xy",id:12, address: {location: "abc"}} 

입니다 있다고 가정합니다. 우리는 config XML 또는 prop 파일을 통해이 매핑을 구동해야합니다. 편집을 할

.... 나는 문법 또는 같은 속성 파일에 정의 된 규칙을 가지고 노력하고

:

address.location = loc 
id = id 
name = name 

이 내가 생각하고 무엇을. 등등 목록,지도, 같은 복잡한 형식을 매핑하는 방법을 확실하지

그래서 내 코드는 부를 것이다

Person p = ObjectMapper.map(jsonData,Person.class,configuration) 

실제 매핑을 수행하는 방법이 무엇입니까

class ObjectMapper { 
public static <T> T map(String jsonData,Class<T> rootType, Map<String,String> rules) { 

    T object = rootType.newInstance(); 
    // TODO: code to parse json using the rules 
    //and finally return object 

    return (T) object; 
} 

이 방법 I 할 계획이야. 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

+1

https://code.google.com/p/google-gson/ 및 자세한 내용 : http://pragmateek.com/javajson-mapping-with-gson/#A_simple_Java-JSON_mapping은 우리에게 코드를 표시 – Dan

+0

당신은 당신이 가지고있는 어떤 문제를 시도하고 설명 했습니까? –

+1

우리는 Reflections를 사용하여 똑같은 것을 할 수 있습니다. –

답변

-1

가져 오기 code.google.com/p/google-gson

이후 프로젝트에이 라이브러리,이 작업을 수행 할 수 있습니다 : 는 ("JSON은"당신이 구문 분석 원하는 JSON 문자열입니다 그것은 당신이 질문에 지정된 하나가 될 수 있습니다. .)

Person personFromJson = new Gson().fromJson(json, Person.class); 
+1

애트리뷰트의 1 대 1 매핑이 없다는 점을 감안하면 OP의 예가 쉽게 처리 될 수 있다고 생각하지 않습니다. – 5gon12eder

+0

아 물론! – ChristopherMortensen

2

다음 코드를 사용하십시오.

import java.lang.reflect.Method; 
import java.lang.reflect.Type; 
import java.util.HashMap; 
import java.util.Map; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class Test { 

    public static void main(String... args) throws Exception{ 
     Map<String, String> rules = new HashMap<>(); 
     rules.put("address.location", "loc"); 
     rules.put("name", "name"); 
     rules.put("id", "id"); 

     String jsonData = "{name:'xy',id:'12', address: {location: 'abc'}, phones: ['a', 'b', 'c']}"; 

     Person person = (Person) map(jsonData, Person.class, rules); 
     System.out.println(new Gson().toJson(person)); 
    } 

    public static Object map(String jsonData, Class<?> rootType, Map<String, String> rules) throws Exception{ 
     Map<String, Object> genericMap = new HashMap<>(); 
     Type type = new TypeToken<Map<String, Object>>() {}.getType(); 
     genericMap = new Gson().fromJson(jsonData, type); 

     Object object = rootType.newInstance(); 

     for (Map.Entry<String, String> entry : rules.entrySet()){ 
      String mapKey = entry.getKey(); 
      String mapValue = entry.getValue(); 

      String keys[] = mapKey.split("\\."); 
      Map<String, Object> obj = null; 
      if(keys.length > 1){ 
       obj = (Map<String, Object>) genericMap.get(keys[0]); 
       for(int i=1;i<keys.length-1;i++){ 
        obj = (Map<String, Object>) obj.get(keys[i]); 
       } 
       // Method method = object.getClass().getDeclaredMethod("set" + capitalize(mapValue) , String.class); 
       // method.invoke(object, (String)obj.get(keys[keys.length-1])); 
       Field field = object.getClass().getDeclaredField(mapValue); 
       field.set(object, obj.get(keys[keys.length - 1])); 
      }else{ 
       // Method method = object.getClass().getDeclaredMethod("set" + capitalize(mapValue) , String.class); 
       // method.invoke(object, (String)genericMap.get(mapValue)); 

       Field field = object.getClass().getDeclaredField(mapValue); 
       field.set(object, genericMap.get(mapValue)); 
      } 
     } 
     return object; 
    } 

    public static String capitalize(String line){ 
     return Character.toUpperCase(line.charAt(0)) + line.substring(1); 
    } 
} 

class Person { 
    String id; 
    String name; 
    String loc; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLoc() { 
     return loc; 
    } 

    public void setLoc(String loc) { 
     this.loc = loc; 
    } 

} 

출력

{"id":"12","name":"xy","loc":"abc","phones":["a","b","c"]} 

세부

  • Gson API를 사용합니다.
  • 이 코드는 a.b.c.itit과 같은 n 개의 숫자로 참조 된 개체에서 작동합니다.
  • 클래스에는 각 필드에 대한 getter/setter가 포함되어야합니다.
  • 규칙 및 POJO의 필드 이름이 일치해야합니다.
+0

코드를 공유해 주셔서 감사합니다. List, Map 및 Complex 유형 (Person에는 일부 ProfessionDetails가 있음)조차도 가능합니까? 필자는 필드 코드, 가입자 번호 및 Person 객체의 속성을 나열하는 데 필요한 매핑 필드가있는 phoneNumber 전화 번호 목록을 가지고 있다고 가정합니다.이 경우 내 규칙을 정의해야합니다. 나는 L-> phonenumbers.exchangecode = L-> phonenumbers.exchangecode와 같이 정의하려고 생각했다. L은 목록을 나타냅니다. C – CompuDynasty

+0

현재 String 유형의 모든 필드를 가정합니다 ("set"+ capitalize (mapValue), String.class). 하지만 반사를 사용하여 데이터 유형을 제공 할 수 있습니다. 나는 List에도 노력했다. –

+0

이 컬렉션을 지원하도록 코드를 변경 했으므로 요구 사항에 따라 파서를 변경해야합니다. 당신은 자신의 파서를 요구 사항에 따라 만들 수 있습니다. –