当前位置: 首页 > 知识库问答 >
问题:

接受toString表示而不是Json语法的Gson解析器

宗沛
2023-03-14

在调试一段将string反序列化为Object的代码时,我意识到JSON解析使用的是toString表示,而不是对象的JSON表示。

POJO:

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Pojo {

    int a;
    String b;
}

分析逻辑:

Gson gsonInstance =
        new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .setDateFormat("yyyy-MM-dd")
                .create();
String json2 = "{a=5, b=field}";
Pojo obj = gsonInstance.fromJson(json2, Pojo.class);

System.out.println(obj);

当我将包含“:”的字段添加到POJO时,这就开始中断。比如约会。

关于这个问题的两个问题:1)Gson是怎么支持这个的?我找不到任何相同的文档。2)我如何处理我前面提到的与日期相关的问题,使用这种toString类型的实现?我尝试为Java转义字符串,但没有帮助。

共有1个答案

莘睿
2023-03-14

这是Gson的一个特性,它实际上是文档化的,但是文档化的有点隐蔽。请参阅:gson.java。JSON反序列化最后调用是

public T fromJson(JsonReader读取器,类型typeOfT)抛出JsonIOException,JSONSyntaxException

在守则正文中,请参阅:

reader.setLenient(true);
 public final void setLenient(boolean lenient)

该方法上的javadoc声明如下:

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

    *
  • 以非执行*前缀开头的流,“)]}'\n”。*
  • 包含多个顶级值的流。对于严格的解析,*每个流必须包含一个顶级值。*
  • 任何类型的顶级值。使用严格解析,顶级*值必须是对象或数组。*
  • 数字可以是{@link double#isnan()NaNs}或{@link*double#isinfinite()infinities}。*
  • 行尾注释以{@code//}或{@code#}开头,*以换行符结尾。*
  • 以{@code/*}开头,以*{@code*}{@code/}结尾的C样式注释。这样的注释可能不会嵌套。*
  • 不带引号或{@code“single quoted”}得名称.*
  • 不带引号或{@code“single quoted”}得字符串.*
  • 由{@code;}分隔的数组元素而不是{@code,}。*
  • 不必要的数组分隔符。它们被解释为null*是省略的值。*
  • 用{@code=}或{@code=>}而不是*{@code:}分隔的名称和值。*
  • 由{@code;}分隔的名称/值对而不是{@code,}。*

以上就是Gson解析您的字符串并反序列化相同的原因。

如果您的名称/值(未加引号)有任何“:”,上述操作将不起作用,原因是Gson将(在您的情况下)解释为name=[value或Another Name???]:value(Gson没有那么宽松)。

使用正确有效的JSON并反序列化。

 类似资料:
  • 如何使用GSON解析这个json? 我的代码: 我的stacktrace com.google.gson.JsonSyn出租车异常:java.lang.IllegalStateExctive:预期BEGIN_OBJECT但BEGIN_ARRAY在第1行第2列路径$com.google.gson.internal.bind.ReflecteTypeAdapterFactory$Adapter.rea

  • 问题内容: 我正在尝试使用Spring 3.0.6返回JSON响应,但是得到了406响应“ Not Acceptable”,其描述为:“此请求所标识的资源仅能够生成具有以下特征的响应:请求“接受”标头()。” 我知道之前曾问过一个非常类似的问题,但尽管进行了许多测试,但我无法使它适用于我的项目,而且我不知道自己在做什么错。 在我的Maven pom.xml中,执行以下操作: 在web.xml中,我

  • 和 是我用来获取JSON并对其进行解析的类。但是当我运行第一个时,它会报告以下堆栈跟踪: 它告诉我添加JsonReader。将lenient(true)设置为我的代码,但我的代码不使用JsonReader。那么如何将setLenient(true)添加到代码中? 编辑:添加API响应(格式化):

  • 本文向大家介绍Android中gson、jsonobject解析JSON的方法详解,包括了Android中gson、jsonobject解析JSON的方法详解的使用技巧和注意事项,需要的朋友参考一下 JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据

  • 问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog