0

こんにちは、Restful + JSON サーブレットを開発していますが、この方法でプロジェクト ソースをコンパイルしようとすると、奇妙な問題が発生します。

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

4 に答える 4

1

jsonObj.get(key);オブジェクトを返します。文字列変数で値を取得する場合は、文字列にキャストする必要があります。JSONObject クラスにはgetStringメソッドがあります。

fields[0][i] = jsonObj.getString(key);

また、 toString()メソッドを呼び出している値のみを出力しているため、テストクラスでエラーが発生することはありません。

于 2012-10-01T12:43:09.860 に答える
0

こんにちは、行を置き換えることでエラーを取り除くことができます

fields[0][i] = jsonObj.get(key);

fields[0][i] = (String)jsonObj.get(key);

System.out.println で出力しているが、文字列変数に割り当てていないため、2番目のコードスニペットでエラーが発生していません

System.out.println(jsonObj.get(key));

したがって、文字列変数にキャストせずに文字列変数に割り当てようとすると、エラーが発生します。

于 2012-10-01T12:57:12.360 に答える
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); 
}
于 2012-10-01T12:47:55.527 に答える