2013-06-04 32 views
5

tôi có dưới đây json:Jackson phân tích cú pháp JSON setter để có giá trị như mảng chuỗi

"[{\"movieName\":\"A\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," + 
    "{\"movieName\":\"\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"B\",\"hero\":\"B1\",\"heroine\":\"B2\",\"source\":\"Netflix\"}," + 
    "{\"movieName\":\"C\",\"Leadactor\":\"C1\",\"leadActress\":\"C2\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," + 
    "{\"movieName\":\"D\",\"Leadactor\":\"D1\",\"leadActress\":\"D2\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," + 
    "{\"movieName\":\"\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"E\",\"hero\":\"E1\",\"heroine\":\"E2\",\"source\":\"Netflix\"}]"; 

Tôi đang sử dụng jackson phân tích cú pháp để ánh xạ nó vào một lớp:

Tôi muốn movieName và movieTitle để ánh xạ vào Tên thuộc tính trong lớp java. Vì vậy, tôi đã viết lớp dưới đây:

public static class MovieData { 
    @JsonProperty("Name") 
    private String name; 

    @JsonSetter({"movieName"}) 
    private void setMovieName(final String name) { 
      if((name != null) && (! name.equals(""))) { 
        setNameInternal(name); 
      } 
    } 

    @JsonSetter("movieTitle") 
    private void setMovieTitle(final String name) { 
      if((name != null) && (! name.equals(""))) { 
        setNameInternal(name); 
      } 
    } 

    private void setNameInternal(final String name) { 
      this.name = name; 
    } 

}

Trong json thật của tôi có rất nhiều lĩnh vực như movieName, movieTitle mà tôi muốn bình thường hóa thành một tên gọi chung.

Có bất kỳ cú pháp đơn giản như dưới đây có thể làm giảm việc lặp lại code:

public static class MovieData { 
    @JsonProperty("Name") 
    private String name; 

@JsonSetter(value = { "movieName", "movieTitle" }) 
private void setName(final String name) { 
     if((name != null) && (! name.equals(""))) { 
       this.name=name; 
     } 
} 
    } 

Đoạn mã trên đã cho tôi lỗi trên jsonSetter:

Type mismatch: cannot convert from String[] to String. 

EDIT

Nếu Jackson không hỗ trợ nó, GSON có thể hỗ trợ hoạt động này không.

Cảm ơn

+1

Câu hỏi của bạn không rõ ràng lắm ... bạn có muốn danh sách các đối tượng 'Phim' có thuộc tính' name', chứa giá trị của '' movieName "' hoặc '" movieTitle không "'? Và nếu, giả sử, '" movieName "' có một giá trị, '" movieTitle "' sẽ luôn luôn là emtpty? – MikO

+1

Bạn đã thử thêm nhiều chú thích vào setName, một cho movieName và một cho movieTitle chưa?Nếu không, giải pháp bên dưới với @JsonAnySetter sẽ hoạt động. – Sumit

+0

@MikO có tôi muốn một danh sách các đối tượng Phim có tên thuộc tính, chứa giá trị của tên phim hoặc tên phim. Có nếu tên phim có tên vlaue thì tiêu đề phim trống. – javaMan

Trả lời

5

Bạn có thể sử dụng @JsonAnySetter, những gì nó đang có nghĩa là bạn có thể tìm thấy trên trang Jackson Core (Data-Binding) Annotations.

Tôi đã tạo ra đậu đơn giản mà có liên quan đến ví dụ của bạn:

class MovieData { 

    private static List<String> NAME_PROPERTIES = Arrays.asList("movieName", "movieTitle"); 

    private String name; 

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

    @JsonAnySetter 
    private void parseUnknownProperties(String propertyName, String propertyValue) { 
     if (NAME_PROPERTIES.contains(propertyName) && !propertyValue.isEmpty()) { 
      this.name = propertyValue; 
     } 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
} 

Bây giờ khi tôi deserialize JSON của bạn theo cách này:

ObjectMapper objectMapper = new ObjectMapper(); 
System.out.println(Arrays.toString(objectMapper.readValue(json, MovieData[].class))); 

Kết quả tôi có thể thấy:

[A, B, C, D, E] 
3

Đừng làm điều này nhiều. nó là rất đơn giản với Gson

tạo lớp cho single kỷ lục thiết lập của bạn như

class Movie{ 
    private String movieName; 
    private String Leadactor; 
    private String leadActress; 

    //put getter and setter for your fields 
} 

in main file 
Type type = new TypeToken<List<Movie>>(){}.getType(); 
List<Movie> data = new Gson().fromJson(json_string,type); 
+0

Tôi biết về gson. vấn đề là về bình thường hóa. Tôi muốn movieTitle cũng để ánh xạ vào movieName; – javaMan

+0

Vui lòng không yêu cầu mọi người bỏ phiếu/chấp nhận câu trả lời của bạn. [Xem bài đăng meta này để biết thêm thông tin] (http://meta.stackexchange.com/q/167155/152134). Cảm ơn! –

0

Bạn khai báo trường như @JsonProperty String[] data

.210

và sử dụng

new ObjectMapper() 
     .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) 
     .readValue(json, YOUT_TYPE.class) 

Vì vậy, tùy chọn này làm cho phần Jackson cả "foo": "thanh" và "foo": [ "a", "b", "c"].

Tất cả những gì bạn cần làm là kết hợp chuỗi chuỗi lại vào chuỗi có dấu tách dòng bên phải. Tôi làm điều đó qua Guava data == null ? null : Jointer.on("\n").join(data)

+0

Biến "json" bạn chuyển đến readValue() là gì? – Charlires

Các vấn đề liên quan