Java Gson解析无引号的值

Java Gson解析无引号的值,java,gson,Java,Gson,我在我的项目GSON库中使用了,一切都很好,但现在我遇到了一个问题,我需要对未引用的值使用自定义反序列化器 我有以下值,需要从json解析: [[“县”,“=”,字段名称],“名称”,“ilike”,“用户名”]] 我需要使用自定义反序列化器将未引用的值解析为包装类,如: public class StringField { private String value; public String getValue() { return value; }

我在我的项目GSON库中使用了,一切都很好,但现在我遇到了一个问题,我需要对未引用的值使用自定义反序列化器

我有以下值,需要从json解析:

[[“县”,“=”,字段名称],“名称”,“ilike”,“用户名”]]

我需要使用自定义反序列化器将未引用的值解析为包装类,如:

public class StringField {
    private String value;

    public String getValue() {
        return value;
    }

}

值将“field_name”作为字符串。

问题是数据无效

JSON不允许像
field\u name
这样的“无引号的值”字符串,Gson也不允许。修复输入,使其成为有效的JSON(可能是
“$field\u name$”
),或者使用能够处理类似JSON的非JSON文本的工具(即非Gson)

使用无法纠正这种情况,因为数据甚至没有正确解析为Json标记:当遇到无效/非Json时,Gson将抛出异常


至少这需要创建一个定制的实现,可以将“裸字”读取为字符串。然而,这是有问题的,因为JsonReader不符合任何专门的接口(所以它必须是子类的,oops!),并且是最终的(所以它不能是子类的,oops!)。因此,除非愿意编辑Gson库源代码:不可能。

使用下面的代码,我解析了您的JSON,没有任何问题,我让Gson决定如何解析它,除非假设它包含最外层的
列表。结果是
List
List
s的
String
s。我不太明白为什么需要
StringField

package stackoverflow.questions;

import java.util.List;

import com.google.gson.*;

public class Q20557131 {

   public static void main(String[] args){

      String json = "[[\"county\",\"=\", field_name], [\"name\", \"ilike\", \"username\"]]";
      Gson g = new Gson();
      List outerList = g.fromJson(json, List.class);


      List innerList = (List) outerList.get(0);
      for(Object o: innerList)
         System.out.println(o.getClass());

   }
}
默认情况下,Gson 2.2.4是宽松的,即使从

将此解析器配置为在其接受的内容上自由。默认情况下,该解析器是严格的,只接受RFC4627指定的JSON。将解析器设置为lenient会导致它忽略以下语法错误:

未加引号或“单引号”的字符串

即使文档声明该属性默认为false,在
JsonReader#fromJson
的源代码中:

 public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {
    boolean isEmpty = true;
    boolean oldLenient = reader.isLenient();
    reader.setLenient(true); <-- always true
    try {
      reader.peek();
      isEmpty = false;
      TypeToken<T> typeToken = (TypeToken<T>) TypeToken.get(typeOfT);
      TypeAdapter<T> typeAdapter = getAdapter(typeToken);
      T object = typeAdapter.read(reader);
      return object;
    } catch (EOFException e) {
    ...
public T fromJson(JsonReader阅读器,键入typeOfT)抛出JsonIOException、JsonSyntaxException{
布尔值isEmpty=true;
布尔值oldLenient=reader.isLenient();

reader.setLenient(true);我在几年前用另一种方式解决了这个问题(很抱歉耽搁了)。编写了符号预处理器类,用regexp标签(如field_name替换为模型中的实际值,然后解析json。

我不确定是否清楚您的问题是什么,以及您需要什么帮助。