大家好我正在开发一个Restful + JSON servlet,但是我遇到了一个奇怪的问题,如果我尝试使用这种方法编译我的项目源:
public
static
WipdDBTable
parseJSON(String JSONBody)
{
JSONObject jsonObj;
JSONTokener jsonTok;
Iterator it;
String[] labels;
String[][] fields;
int i;
try {
jsonTok = new JSONTokener(JSONBody);
jsonObj = new JSONObject(jsonTok);
labels = new String[jsonObj.length()];
fields = new String[1][labels.length];
i = 0;
it = jsonObj.keys();
while(it.hasNext()) {
String key = it.next().toString();
labels[i] = key;
fields[0][i] = jsonObj.get(key);
i++;
}
return new WipdDBTable(labels, fields);
} catch(JSONException ex) {
return null;
}
}
我收到此错误:
WipdJSON.java:102: incompatible types
found : java.lang.Object
required: java.lang.String
fields[0][i] = jsonObj.get(key);
所以我写了一个测试类,显然是相同的源代码,但有了这个,我没有得到任何错误:
public class jsontest
{
public static
void
main(String[] args)
{
String s1;
JSONObject jsonObj;
JSONTokener jsonTok;
s1 = "{\"lo\":\"ol\",\"json\":{\"1\":\"2\"},\"yo\":{\"lol\":\"lol\"}}";
try {
jsonTok = new JSONTokener(s1);
jsonObj = new JSONObject(jsonTok);
Iterator it = jsonObj.keys();
while(it.hasNext()) {
String key = it.next().toString();
System.out.print(key + "=>");
System.out.println(jsonObj.get(key));
}
} catch(JSONException ex) {
ex.printStackTrace();
}
}
}
答案 0 :(得分:1)
jsonObj.get(key);
返回一个Object,如果要获取String变量中的值,则需要将其强制转换为String。 JSONObject类中有一个getString方法:
fields[0][i] = jsonObj.getString(key);
您在 test 课程中没有收到任何错误,因为您只输出调用toString()方法的值。
答案 1 :(得分:0)
fields[0][i] = jsonObj.get(key);
将其更改为
fields[0][i] = (String) jsonObj.get(key);
现在,您将Object
投射到String
。如果您不确定String
是否始终与instanceof
运营商核对。
Object obj = jsonObj.get(key);
if(obj instanceof String)
{
fields[0][i] = (String) jsonObj.get(key);
}
答案 2 :(得分:0)
获取方法签名看起来像这样
java.lang.Object get(java.lang.String key)
所以你必须在实际类型中保留它。
例如
String key = (String)jsonObj.get(key);
答案 3 :(得分:0)
您可以通过更换行
来解决错误 fields[0][i] = jsonObj.get(key);
带
fields[0][i] = (String)jsonObj.get(key);
并且它没有在第二个代码片段中给出错误,因为您在System.out.println中打印它但没有将它分配给任何String变量
System.out.println(jsonObj.get(key));
因此,如果您尝试在任何String变量中分配它而不将其转换为String变量,那么它也会给出错误。