Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JSONObject兼容char和boolean作为key的建议和实现 #3352

Closed
iyun1984 opened this issue Jul 17, 2020 · 1 comment
Closed

JSONObject兼容char和boolean作为key的建议和实现 #3352

iyun1984 opened this issue Jul 17, 2020 · 1 comment

Comments

@iyun1984
Copy link

iyun1984 commented Jul 17, 2020

@ZivYan #3347 #3093
建议在JSONObject.java中对containsKey(Object key)和get(Object key)方法进行如下调整以更好的支持key为number、char和boolean类型的业务
修改内容如下:

private static final Set<Class> KEY_TYPES = new HashSet(Arrays.asList(Character.class,Boolean.class));
public boolean containsKey(Object key) {
    boolean result = map.containsKey(key);
    if (!result) {
    	if(key instanceof Number || KEY_TYPES.contains(key.getClass())) {
    		result = map.containsKey(key.toString());
    	}
    }
    return result;
}

public Object get(Object key) {
    Object val = map.get(key);
    if (val == null) {
    	if(key instanceof Number || KEY_TYPES.contains(key.getClass())) {
    		val = map.get(key.toString());
    	}
    }
    return val;
}

测试代码如下:

@RunWith(Theories.class)
public class JSONTest {
@DataPoint
public static Object i = 1;
@DataPoint
public static Object s = "hello";
@DataPoint
public static Object b = true;
@DataPoint
public static Object c = 'a';
@DataPoint
public static Object f = 3.14;

@Theory
public void testToJSONObject(Object key,Object value) {
	toJSON(key,value,"-result:%b;key:%s;value:%s");
}
public void toJSON(Object key,Object value,String msg) {
	Map<Object,Object> map = new HashMap<Object,Object>();
	map.put(key, value);
	JSONObject obj = (JSONObject)JSON.toJSON(map);
	boolean result = obj.containsKey(key)&&obj.containsValue(value);
	if(result) {
		System.out.println(String.format(msg, result, key.getClass().getSimpleName(), value.getClass().getSimpleName()));
	}else {
		System.err.println(String.format(msg, result, String.valueOf(obj.containsKey(key)), String.valueOf(obj.containsValue(value))));
		System.err.println(String.format(msg, result, key.getClass().getSimpleName(), value.getClass().getSimpleName()));
	}
	Assert.assertTrue(result);
}

}

测试结果如下:

-result:true;key:Boolean;value:Boolean
-result:true;key:Boolean;value:Character
-result:true;key:Boolean;value:Double
-result:true;key:Boolean;value:Integer
-result:true;key:Boolean;value:String
-result:true;key:Character;value:Boolean
-result:true;key:Character;value:Character
-result:true;key:Character;value:Double
-result:true;key:Character;value:Integer
-result:true;key:Character;value:String
-result:true;key:Double;value:Boolean
-result:true;key:Double;value:Character
-result:true;key:Double;value:Double
-result:true;key:Double;value:Integer
-result:true;key:Double;value:String
-result:true;key:Integer;value:Boolean
-result:true;key:Integer;value:Character
-result:true;key:Integer;value:Double
-result:true;key:Integer;value:Integer
-result:true;key:Integer;value:String
-result:true;key:String;value:Boolean
-result:true;key:String;value:Character
-result:true;key:String;value:Double
-result:true;key:String;value:Integer
-result:true;key:String;value:String

@iyun1984
Copy link
Author

仔细想想,还是用这种写法更为简单清晰:

public Object get(Object key) {
	return map.get(key==null?key:key.toString());
}
public boolean containsKey(Object key) {
    return map.containsKey(key==null?key:key.toString());
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant