1

これは JSON 文字列 1 です

{"title":["1","2"], "amount":["1","2"]}

これは JSON 文字列 2 です

{"title":"", "amount":""}

フォームに値を入力すると文字列 1 が作成され、入力しないと文字列 2 が作成されます。文字列が形式 1 であるか、タイトルが配列 ["1", "2"] であるか、形式 2 であるかを知りたいです。 title は、解析前のサーブレットのサーバー側の単なる文字列 "" です。そうする方法はありますか?

これは私の以前の質問 です。サーブレットで GSON を使用してこの JSON 文字列を解析するにはどうすればよいですか

これは解決されましたが、ご覧のとおり、ArrayList型のインスタンス変数を持つクラスDataがあるため、この行で解析すると

Data data = gson.fromJson(param, Data.class);

それは例外をスローします

 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 24

ArrayList を宣言したので、json 内の配列のみが例外なく解析されることが期待されるため....しかし、フォームに値を入力しないと、json 文字列が作成されません。

{"title":[], "amount":[]}

むしろ、このように作成します

{"title":'', "amount":''}

文字列を値として持つため、解析で例外がスローされます

4

2 に答える 2

3

この問題もありましたが、これが私がそれを回避した方法です

あなたのデータオブジェクトには

public class Data {
    // This is a generic object whose type is determined when used by GSON
    private Object title;

    // get the type of object and return as string
    public String getTitleObjType() {
            String objType = title.getClass().toString();
        return objType;
    }

    // used if the object is an ArrayList, convert into an ArrayList<Object>
    public ArrayList<String> getTitleArrayList() {
        // Turn the Object into an arraylist
        @SuppressWarnings("unchecked")  // This is to counter the fact that the cast is not type safe
        ArrayList<String> titleArrayList = (ArrayList<String>) title;
        return titleArrayList;
    }

    // used if the object is not an array
    public String getTitleStr() {
            return title.toString();
    }
}

GSON がオブジェクトを作成すると、作成され、それぞれが String または ArrayList になります。

次に、オブジェクトを使用するときに、それらが何であるかをテストして確認します

ArrayList<String> titleValArrayList = new ArrayList<String>();
String titleValStr = "";

if(getTitleObjType.equals("class java.util.ArrayList")) {
         titleValArrayList = getTitleArrayList();
         //do whatever you like
}
else if(getTitleObjType.equals("class java.util.String")) {
         titleValStr = getsTitleStr();
         //do whatever you like
}
于 2013-07-15T05:55:20.030 に答える
2

Google GSONをチェックすると、JSON サーバー側を解析できます。

次のようになります。

 String jsonString = request.getParameter("jsonParemeter");
 Gson gson = new Gson();
 Map fromJsonMap = gson.fromJson(jsonString, HashMap.class);

 Object object = fromJsonMap.get("title");
 if (object instanceof Collection) {
  // then is it's your array
 }
 else {
   // it's not
 } 

たとえば、次のサンプル コードを実行するとします。

String json1 = "{\"title\":[\"1\",\"2\"], \"amount\":[\"1\",\"2\"]}";
String json2 = "{\"title\":\"\", \"amount\":\"\"}";

Gson gson = new Gson();
HashMap map = gson.fromJson(json1, HashMap.class);
HashMap map2 = gson.fromJson(json2, HashMap.class);

System.out.println(map);
System.out.println(map2);

System.out.println(map.get("amount").getClass());
System.out.println(map2.get("amount").getClass());

私は出力として得ます:

{amount=[1, 2], title=[1, 2]}
{amount=, title=}
class java.util.ArrayList
class java.lang.String

私があなたを正しく理解していれば、あなたに100%合っていると思います

アップデート

JSON 文字列を Data オブジェクトに直接逆シリアル化しようとしているため、その直接逆シリアル化を続けたい場合は、カスタムの逆シリアル化メカニズムを使用する必要があります

于 2012-11-30T18:29:50.623 に答える