【问题标题】:validate JSON string if the value of parameter is string or an array如果参数的值为字符串或数组,则验证 JSON 字符串
【发布时间】:2012-11-19 00:09:18
【问题描述】:

这是 JSON 字符串 1

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

这是 JSON 字符串 2

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

字符串 1 是在我在表单中输入值时创建的,而字符串 2 是在我不输入时创建的, 我想知道字符串是格式 1,即标题是数组 ["1","2"] 还是格式 2,即标题只是 servlet 中服务器端的字符串 "",然后再解析它.有什么办法吗?

这是我之前的问题, How do I parse this JSON string using GSON in servlet

这已经解决了,但是你可以看到我有类 Data,它有 ArrayList 类型的实例变量,所以当我用这一行解析它时

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":''}

以字符串为值,导致解析抛出异常

【问题讨论】:

  • typeof elm == 'string'elm instanceof Array
  • @inhan 你能用一两行告诉我吗,写在答案中
  • 如果您想要 Java 的解决方案,请不要将您的问题标记为 JavaScript……我认为它与 JS 没有任何关系。
  • 我认为它有javascript数组,所以也添加了javascript标签
  • 我的解决方案是基于 javascript,看过您的 Javascript 标签。所以我在下面删除了我的答案。出于同样的原因,请忽略我上面的评论。

标签: java json servlets gson


【解决方案1】:

检查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 对象,因此如果您想继续进行直接反序列化,您必须使用 custom deserialization mechanism

【讨论】:

  • 我想在解析之前检查一下。因为如果它的字符串 2 如上所述,那么 fromJson 将抛出异常
  • @vikasdevde:fromJson 不会抛出异常,字符串 1 会返回数组,字符串 2 会返回字符串(空字符串)。用示例代码检查我编辑的答案
  • 不,您不知道这里的情况,是的,您是正确的,感谢您的宝贵时间。 +1
  • @vikasdevde:如果还有其他需要考虑的条件,我建议您编辑您的问题以便更具体,以便我或任何堆栈溢出成员可以正确地帮助您。
【解决方案2】:

我也遇到过这个问题

在你的数据对象中有

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
}

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 2019-05-05
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多