Skip to content

Commit

Permalink
提供一些比较傲容易实例化的 Region,同时为 Json 增加一个强制输出字符串的功能
Browse files Browse the repository at this point in the history
  • Loading branch information
zozoh committed Sep 23, 2013
1 parent ce91fee commit efc7fbf
Show file tree
Hide file tree
Showing 12 changed files with 307 additions and 70 deletions.
10 changes: 10 additions & 0 deletions src/org/nutz/json/JsonField.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,14 @@
*/
boolean ignore() default false;

/**
* 有些对象类型总是被当做字符串输出会有更好的效果,比如 Region<br>
* 当然这些对象是可以被 Castors 从字符串正确的转换回来的。即它们有一个带一个字符串为参数的构造函数即可
* <p>
* 这个声明,也将作用于数组,和集合
*
* @return 这个字段是否被强制输出成字符串
* @see org.nutz.lang.util.Region
*/
boolean forceString() default false;
}
20 changes: 18 additions & 2 deletions src/org/nutz/json/entity/JsonEntityField.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@ public class JsonEntityField {

private Ejecting ejecting;

private boolean forceString;

public boolean isForceString() {
return forceString;
}

public void setForceString(boolean forceString) {
this.forceString = forceString;
}

public boolean isIgnore() {
return ignore;
}
Expand Down Expand Up @@ -54,7 +64,8 @@ public static JsonEntityField eval(Mirror<?> mirror, Field fld) {
// 以特殊字符开头的字段,看起来是隐藏字段
// XXX 有用户就是_开头的字段也要啊! by wendal
// if (fld.getName().startsWith("_") || fld.getName().startsWith("$"))
if (fld.getName().startsWith("$") && fld.getAnnotation(JsonField.class) == null)
if (fld.getName().startsWith("$")
&& fld.getAnnotation(JsonField.class) == null)
return null;

JsonField jf = fld.getAnnotation(JsonField.class);
Expand All @@ -66,10 +77,15 @@ public static JsonEntityField eval(Mirror<?> mirror, Field fld) {
jef.injecting = mirror.getInjecting(fld.getName());

// 瞬时变量和明确声明忽略的,变 ignore
if (Modifier.isTransient(fld.getModifiers()) || (null != jf && jf.ignore())) {
if (Modifier.isTransient(fld.getModifiers())
|| (null != jf && jf.ignore())) {
jef.setIgnore(true);
}

// 判断字段是否被强制输出为字符串
if (null != jf)
jef.setForceString(jf.forceString());

return jef;
}

Expand Down
44 changes: 38 additions & 6 deletions src/org/nutz/json/impl/JsonRenderImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,16 @@ private void appendName(String name) throws IOException {

private void appendPairBegin() throws IOException {
if (!isCompact(this))
writer.append(NL).append(Strings.dup(format.getIndentBy(), format.getIndent()));
writer.append(NL).append(Strings.dup(format.getIndentBy(),
format.getIndent()));
}

private void appendPairSep() throws IOException {
writer.append(!isCompact(this) ? " :" : ":");
}

protected void appendPair(boolean needPairEnd, String name, Object value) throws IOException {
protected void appendPair(boolean needPairEnd, String name, Object value)
throws IOException {
appendPairBegin();
appendName(name);
appendPairSep();
Expand All @@ -144,7 +146,8 @@ private void appendBraceBegin() throws IOException {

private void appendBraceEnd() throws IOException {
if (!isCompact(this))
writer.append(NL).append(Strings.dup(format.getIndentBy(), format.getIndent()));
writer.append(NL).append(Strings.dup(format.getIndentBy(),
format.getIndent()));
writer.append('}');
}

Expand All @@ -168,14 +171,16 @@ private void map2Json(Map map) throws IOException {
ArrayList<Pair> list = new ArrayList<Pair>(map.size());
Set<Entry<?, ?>> entrySet = map.entrySet();
for (Entry entry : entrySet) {
String name = null == entry.getKey() ? "null" : entry.getKey().toString();
String name = null == entry.getKey() ? "null" : entry.getKey()
.toString();
Object value = entry.getValue();
if (!this.isIgnore(name, value))
list.add(new Pair(name, value));
}
writeItem(list);
}

@SuppressWarnings("unchecked")
private void pojo2Json(Object obj) throws IOException {
if (null == obj)
return;
Expand All @@ -190,7 +195,8 @@ private void pojo2Json(Object obj) throws IOException {
if (toJsonMethod.getParameterTypes().length == 0) {
writer.append(String.valueOf(toJsonMethod.invoke(obj)));
} else {
writer.append(String.valueOf(toJsonMethod.invoke(obj, format)));
writer.append(String.valueOf(toJsonMethod.invoke(obj,
format)));
}
return;
}
Expand Down Expand Up @@ -219,6 +225,31 @@ private void pojo2Json(Object obj) throws IOException {
value = null;
}
}
// 如果是强制输出为字符串的
if (null != value && jef.isForceString()) {
// 数组
if (value.getClass().isArray()) {
String[] ss = new String[Array.getLength(value)];
for (int i = 0; i < ss.length; i++) {
ss[i] = Array.get(value, i).toString();
}
value = ss;
}
// 集合
else if (value instanceof Collection) {
Collection col = (Collection) Mirror.me(value)
.born();
for (Object ele : (Collection) value) {
col.add(ele.toString());
}
value = col;
}
// 其他统统变字符串
else {
value = value.toString();
}
}

// 加入输出列表 ...
list.add(new Pair(name, value));
}
Expand Down Expand Up @@ -273,7 +304,8 @@ private void string2Json(String s) throws IOException {
break;
default:
if (c >= 256 && format.isAutoUnicode())
writer.append("\\u").append(Integer.toHexString(c).toUpperCase());
writer.append("\\u").append(Integer.toHexString(c)
.toUpperCase());
else
writer.append(c);
}
Expand Down
32 changes: 32 additions & 0 deletions src/org/nutz/lang/util/DateRegion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.nutz.lang.util;

import java.util.Date;

import org.nutz.lang.Strings;
import org.nutz.lang.Times;

public class DateRegion extends Region<Date> {

public DateRegion() {
super();
}

public DateRegion(String str) {
super();
this.valueOf(str);
}

public Date fromString(String str) {
str = Strings.trim(str);
if (Strings.isEmpty(str))
return null;
return Times.D(str);
}

public String toString(Date d) {
String str = Times.sDT(d);
if (str.endsWith(" 00:00:00"))
return str.substring(0, 10);
return str;
}
}
14 changes: 14 additions & 0 deletions src/org/nutz/lang/util/DoubleRegion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.nutz.lang.util;

public class DoubleRegion extends Region<Double> {

public DoubleRegion() {
super();
}

public DoubleRegion(String str) {
super();
this.valueOf(str);
}

}
14 changes: 14 additions & 0 deletions src/org/nutz/lang/util/FloatRegion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.nutz.lang.util;

public class FloatRegion extends Region<Float> {

public FloatRegion() {
super();
}

public FloatRegion(String str) {
super();
this.valueOf(str);
}

}
14 changes: 14 additions & 0 deletions src/org/nutz/lang/util/IntRegion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.nutz.lang.util;

public class IntRegion extends Region<Integer> {

public IntRegion() {
super();
}

public IntRegion(String str) {
super();
this.valueOf(str);
}

}
14 changes: 14 additions & 0 deletions src/org/nutz/lang/util/LongRegion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.nutz.lang.util;

public class LongRegion extends Region<Long> {

public LongRegion() {
super();
}

public LongRegion(String str) {
super();
this.valueOf(str);
}

}
37 changes: 10 additions & 27 deletions src/org/nutz/lang/util/Region.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package org.nutz.lang.util;

import java.util.Date;

import org.nutz.castor.Castors;
import org.nutz.lang.Mirror;
import org.nutz.lang.Strings;
import org.nutz.lang.Times;

/**
* 描述了一个区间
Expand Down Expand Up @@ -45,38 +42,24 @@
*/
public abstract class Region<T extends Comparable<T>> {

public static Region<Integer> Int(String str) {
return new Region<Integer>() {}.valueOf(str);
public static IntRegion Int(String str) {
return new IntRegion(str);
}

public static Region<Long> Long(String str) {
return new Region<Long>() {}.valueOf(str);
public static LongRegion Long(String str) {
return new LongRegion(str);
}

public static Region<Float> Float(String str) {
return new Region<Float>() {}.valueOf(str);
public static FloatRegion Float(String str) {
return new FloatRegion(str);
}

public static Region<Double> Double(String str) {
return new Region<Double>() {}.valueOf(str);
public static DoubleRegion Double(String str) {
return new DoubleRegion(str);
}

public static Region<Date> Date(String str) {
return new Region<Date>() {
public Date fromString(String str) {
str = Strings.trim(str);
if (Strings.isEmpty(str))
return null;
return Times.D(str);
}

public String toString(Date d) {
String str = Times.sDT(d);
if (str.endsWith(" 00:00:00"))
return str.substring(0, 10);
return str;
}
}.valueOf(str);
public static DateRegion Date(String str) {
return new DateRegion(str);
}

protected Class<T> eleType;
Expand Down
Loading

0 comments on commit efc7fbf

Please sign in to comment.