无法编译源显然相同

时间:2012-10-01 12:41:34

标签: java json

大家好我正在开发一个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();
        }

    }
}

4 个答案:

答案 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变量,那么它也会给出错误。