2017-03-13 1 views
1

를 역 직렬화 할 때 맵 값에 키에 대한 참조를 유지 나는 다음과 같은 JSON이 있습니다잭슨이 :

{ 
    "users": { 
     "john": { "name": "John Doe" }, 
     "mark": { "name": "Mark Smith" } 
    } 
} 

을 내가 직렬화에 대한 다음과 같은 클래스를 사용하고 있습니다 :

class User { 
    public String username, name; 
} 

public class Users { 
    public Map<String,User> users; 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     Users all = mapper.readValue(Files.newBufferedReader(Paths.get("test.json")), Users.class); 
    } 
} 

나는 필드를 원하는 User.usernameusers지도에 키가 포함되어 있어야합니다.

예를 들어 all.users.get("john").username"john"이어야합니다.

어떻게하면됩니까?

답변

0

사용자 개체에 대한 사용자 지정 데시리아 화를 만들고이를 Map에 사용하십시오. 전체 예제는 다음과 같습니다.

@Test 
public void test() throws JsonParseException, JsonMappingException, IOException { 
    ObjectMapper mapper = new ObjectMapper(); 

    Data data = mapper.readValue("{\"users\": {\"John\": {\"id\": 20}, \"Pete\": {\"id\": 30}}}", Data.class); 

    assertEquals(20, data.users.get("John").id); 
    assertEquals(30, data.users.get("Pete").id); 
    assertEquals("John", data.users.get("John").name); 
    assertEquals("Pete", data.users.get("Pete").name); 
} 

public static class Data { 
    @JsonDeserialize(contentUsing = Deser.class) 
    public Map<String, User> users; 
} 

public static class User { 
    public String name; 
    public int id; 
} 

public static class Deser extends JsonDeserializer<User> { 

    @Override 
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     String name = ctxt.getParser().getCurrentName(); 

     User user = p.readValueAs(User.class); 

     user.name = name; // This copies the key name to the user object 

     return user; 
    } 
} 
0

처음으로 ObjectMapperclass 개체를 configure 개 생성하십시오.

다음 중 하나를 시도해보십시오.

샘플 코드

Map<K, V> map; 
ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
map = mapper.readValue(jsonStr, new TypeReference<Map<K, V>>() {}); 

당신이 Map를 사용하여 값을 얻을 수있는 것보다.