WEB开发网
开发学院软件开发Java 用 annotation 辅助 Json-lib 转换 JavaBean 阅读

用 annotation 辅助 Json-lib 转换 JavaBean

 2010-07-19 00:00:00 来源:WEB开发网   
核心提示: 首先,需要一个代码标注(IntegerCode)及一个处理这种标注的 PropertyFilter,用 annotation 辅助 Json-lib 转换 JavaBean(6),清单 7. IntegerCode 及 IntegerCodeFilter@Documented@Target({E

首先,需要一个代码标注(IntegerCode)及一个处理这种标注的 PropertyFilter。

清单 7. IntegerCode 及 IntegerCodeFilter

@Documented 
@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface IntegerCode { 
  public int value(); 
} 
 
public class IntegerCodeFilter extends AbstractMethodFilter { 
  // 代码处理器 
  private IntegerCodeProcessor _processor; 
  public IntegerCodeFilter(final IntegerCodeProcessor processor) { 
    _processor = processor; 
  } 
 
  // 不过滤属性,但当发现IntegerCode标注时,将数据传递给Processor 
  public boolean apply(final Method method) { 
    if (_processor == null) { 
      return false;                // 表示没有特别的处理 
    } 
    if (method.isAnnotationPresent(IntegerCode.class)) { 
      IntegerCode anno = method.getAnnotation(IntegerCode.class); 
      int code = anno.value(); 
      _processor.setMainCode(code);        // 将code设置为主代码 
    } 
    return false; 
  } 
} 

现在,我们需要一个 JsonValueProcessor 来处理 IntegerCode 数据。

清单 8. IntegerCodeProcessor

public class IntegerCodeProcessor implements JsonValueProcessor { 
 
  private int _iMainCode; 
 
  public void setMainCode(final int mainCode) { _iMainCode = mainCode; } 
 
  public IntegerCodeProcessor() { 
    super(); 
  } // END: IntegerCodeProcessor 
 
  private void reset() { 
    _iMainCode = -1; 
  } 
 
  public Object processArrayValue(Object value, JsonConfig jsonConfig) { 
    return process(value, jsonConfig); 
  } // END: processArrayValue 
 
  public Object processObjectValue( 
      String key, Object value, JsonConfig jsonConfig ) { 
    return process( value, jsonConfig ); 
  } // END: processObjectValue 
 
  private Object process(Object value, JsonConfig jsonConfig) { 
    if (value == null) { 
      return null; 
    } 
    String ret = null; 
    if (value instanceof Integer && _iMainCode >= 0) { 
      int code = value.intValue(); 
      switch (_iMainCode) { 
        case 100:          // 这里使用简单的case 处理不同的代码 
          if (code == 1) {     // 好一点的方式是从资源文件中读取对应值 
            ret = "man"; 
          } else if (code == 2) { 
            ret = "woman"; 
          } else { 
            ret = value.toString(); 
          } 
          break; 
        default: 
          ret = value.toString(); 
          break; 
      } 
    } else { 
      ret = value.toString(); 
    } 
    reset();               // 处理后重置,以免影响其他 Integer 属性 
 
    return ret; 
  } // END: process 
} 

现在,我们创建一个 JavaBean:Student 来测试这个 Processor。

清单 9. 测试 IntegerCodeProcessor

public class Student { 
  private String name = "camry"; 
  private int gender = 1; 
   
  // getters & setters 
  public String getName() { return name; } 
  @IntegerCode(100)               // 性别主代码为 100 
  public int getGender() { return gender; }} 
} 
 
... 
IntegerCodeProcessor processor = new IntegerCodeProcessor(); 
IntegerCodeFilter filter = new IntegerCodeFilter(processor); 
JsonConfig config = new JsonConfig(); 
config.setJsonPropertyFilter( filter ); 
config.registerJsonValueProcessor(Integer.class, processor); 
 
System.out.println( JSONSerializer.toJSON( new Student(), config ) ); 
// prints {“gender”:”man”, "name":"camry"} 

结束语

Json-lib 可以很方便的进行 JavaBean 到 JSON 数据的转换,再结合 annotation 为 JavaBean 的属性定义元数据,可以减少代码,提高效率。

上一页  1 2 3 4 5 6 

Tags:annotation 辅助 Json

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接