2011-10-25 31 views
5

Tôi serializing một lớp học như thế này vào JSON sử dụng Flexjson:Làm thế nào để loại trừ các trường giá trị null khi sử dụng Flexjson?

public class Item { 
    private Long id; 
    private String name; 
    private String description; 
    ... 

    // Getters and setters 
    ... 
} 

Nhiều người trong số các lĩnh vực mục có thể được null (ví dụ, mô tả). Do đó, khi đó một đối tượng Item được đăng bằng Flexjson, tôi nhận được JSON sau:

{"id":62,"name":"Item A","description":null,...} 

Kể từ khi, như tôi đã đề cập, một đối tượng mục có thể chứa nhiều lĩnh vực null-giá trị, outcoming JSON dài hơn một cách hiệu quả cần thiết. Đây là một vấn đề, bởi vì tôi muốn gửi JSON được tạo từ máy chủ web đến máy khách di động qua kết nối không dây qua WiFi, 3G, EDGE hoặc GPRS (tức là cần nhiều băng thông hơn, dẫn đến tốc độ ít hơn)).

Vì vậy, tôi muốn hỏi làm cách nào để có thể (hiệu quả) loại trừ các thuộc tính giá trị null bằng Flexjson?

Cảm ơn!

Trả lời

16

Bạn có thể sử dụng các biến sau:

import flexjson.transformer.AbstractTransformer; 

public class ExcludeTransformer extends AbstractTransformer { 

    @Override 
    public Boolean isInline() { 
     return true; 
    } 

    @Override 
    public void transform(Object object) { 
     // Do nothing, null objects are not serialized. 
     return; 
    } 
} 

với việc sử dụng sau đây:

new JSONSerializer().transform(new ExcludeTransformer(), void.class).serialize(yourObject) 

Lưu ý rằng tất cả các lĩnh vực null sẽ được loại trừ.

Thêm Transformer bởi Path (vs bởi Class) không được hỗ trợ như FlexJSON lực lượng TypeTransformer cho các giá trị null:

JSONContext.java: dòng 95:

0

Tôi chưa thử tình hình của bạn một cách chính xác, nhưng tôi tin rằng những điều sau đây nên giải quyết vấn đề của bạn:

Item item; 
// Assign item here 
JSONSerializer json = new JSONSerializer(); 
if (item.description != null) { 
    json.exclude(field); 
} 
return json.serialize(item); 

Rõ ràng, có thể bạn muốn truy cập vào lĩnh vực mô tả cách sử dụng một getter. Ngoài ra, bạn có thể muốn lặp lại các trường thể hiện của bạn bằng cách sử dụng sự phản chiếu để loại trừ các trường rỗng.

+0

Vâng, có vẻ như với tôi rằng đây là giải pháp duy nhất. Cảm ơn – Matthias

+0

Không vấn đề gì. :) – conciliator

1

Tôi là một newbie, tôi đã có cùng một vấn đề và không thể tìm thấy bất kỳ giải pháp về nguồn giả mạo vì vậy tôi sử dụng biểu thức chính quy để loại bỏ tất cả các null từ JSON Chuỗi

/** 
* This Function removes all the key:value pairs from the Json String for which the value equals null 
* @param jsonStringWithNullKeys 
* @return jsonStringWithoutNullKeys 
*/ 
public static String getJsonStringWithoutNullKeys(String jsonStringWithNullKeys) 
{ 
    Pattern p = Pattern.compile("([,]?\"[^\"]*\":null[,]?)+"); 
    Matcher m = p.matcher(jsonStringWithNullKeys); 
    StringBuffer newString = new StringBuffer(jsonStringWithNullKeys.length()); 

    while(m.find()) 
    { 
     if(m.group().startsWith(",") & m.group().endsWith(",")) m.appendReplacement(newString, ","); 
     else 
      m.appendReplacement(newString, ""); 
    } 
    m.appendTail(newString); 
    return newString.toString(); 
} 
Các vấn đề liên quan