- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Gson
解析这个序列化字符串
。
{
//other variables
"MODIFIED_ON":"/Date(1490354840000)/",
"MARKET_APP_URL":"http://marketplac...",
//other variables
}
我只发布了这两行,因为它们会引发错误。
此 String
来自 C# webservice
,它使用 JsonConvert.SerializeObject(MyObject)
。
这是我的错误:
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 1 path $
我的问题出在这一行和另一行中,因为它包含一些字符,例如 +
、\
。 (
, )
, ...
我尝试用更简单的格式替换日期,但我什至不能对那些字符串使用 Split
..
我怎样才能反序列化这个 String
而不会出现像这样的问题?
这是我的代码,带有用于数据的自定义 Serializer
:
JsonDeserializer<Date> deser = new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
String s = json.getAsString();
if (s.contains("Date")) {
s = s.split(String.valueOf('('))[1].split(String.valueOf(')'))[0];
return new Date(Long.parseLong(s));
}
else
return new Date(Long.valueOf("-2208988800000"));
}
};
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, deser).create();
JsonParser parser = new JsonParser();
JsonElement mJson = parser.parse(Pattern.quote(userInfo));
LoggedUser loggedUser = gson.fromJson(mJson, LoggedUser.class); //this line is throwing the error
最佳答案
您的代码有几个问题。
首先,Pattern.quote
旨在引用正则表达式。无论你打算用它做什么,都会在头部和尾部分别用 \Q
和 \E
包裹一个带引号的字符串:
System.out.println(Pattern.quote("foo"));
变成:
\Qfoo\E
来分隔引用的正则表达式。这会导致 JSON 解析器失败:由于这些正则表达式文字,您的 JSON 文档变得无法解析。只是不要在那里使用它:
Expected value at line 1 column 1 path $
接下来,您不需要创建JsonParser
。它的目的是根据给定的输入创建内存中的 JSON 树。因此,除了给定的输入之外,您还将获得一个中间 JSON 树(JsonElement
及其子类),它会无缘无故地消耗内存和一些性能。
第三,使用正则表达式提取文本还不错。我不确定与使用子字符串进行字符串切片相比的真实性能,但至少它会给你更多的表达:
final class DateJsonDeserializer
implements JsonDeserializer<Date> {
// Can be a singleton, but exposing via a factory method and leaving the constructor private (let the caller not care on _how_ this is instantiated)
private static final JsonDeserializer<Date> dateJsonDeserializer = new DateJsonDeserializer();
// /\/Date\(\d+\)\// as if it were sed
private static final Pattern datePattern = Pattern.compile("/Date\\((\\d+)\\)/");
// Just cache your default date, note the L literal for longs, so no need to parseLong at all
private DateJsonDeserializer() {
}
static JsonDeserializer<Date> getDateJsonDeserializer() {
return dateJsonDeserializer;
}
@Override
public Date deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext context)
throws JsonParseException {
final String dateLiteral = jsonElement.getAsString();
final Matcher matcher = datePattern.matcher(dateLiteral);
// Not a valid date literal? Better throw an exception or improve the parser somehow, but don't return 1900 if possible
if ( !matcher.matches() ) {
throw new JsonParseException("Cannot parse: " + dateLiteral);
}
return new Date(parseLong(matcher.group(1)));
}
}
示例映射:
final class LoggedUser {
@SerializedName("MODIFIED_ON")
final Date modifiedOn = null;
@SerializedName("MARKET_APP_URL")
final URL marketAppUrl = null;
}
final Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, getDateJsonDeserializer())
.create();
final LoggedUser loggedUser = gson.fromJson(JSON, LoggedUser.class);
System.out.println(loggedUser.modifiedOn);
System.out.println(loggedUser.marketAppUrl);
输出:
Fri Mar 24 13:27:20 EET 2017
http://marketplac...
关于从 .NET 序列化字符串反序列化时出现 Android MalformedJsonException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42999223/
我目前正在对一个 mmorpg 的二进制网络协议(protocol)进行逆向工程。我正在用 java 实现该协议(protocol)。 对于每个数据包类型,我将创建一个表示二进制数据的类。 例如,聊天
我正在尝试围绕现有类编写半透明包装器,我希望它能够模仿其他类的序列化。 例如,给定以下类: class Foo { [JsonConverter(CustomConverter)] s
是否有使用 Jackson 序列化和反序列化枚举集的简单方法? private enum Type { YES, NO } @JacksonXmlProperty(localName = "t
我很想知道当我们反序列化一个对象时会发生什么。 例如,如果我的类对象由许多其他对象组成,对象创建过程如何在反序列化过程中发生 最佳答案 对象是用默认的初始化字段创建的,然后用从串行流中获取的属性值填充
我正在尝试序列化和反序列化(使用 QDataStream 但这与这里无关)一个 enum class变量: enum class Type : char { Trivial, Comp
我不确定这到底有什么问题...它不会为我编译,我将它从 c 翻译成 C++(或尝试)...是的,我是初学者。谢谢! #include #include using namespace std; i
我遇到的问题与此处描述的问题非常相似:Combining type and field serializers case class(id: Option[UUID], otherValue:Stri
我们知道base中的apply()可以对数组的边距应用一个函数,边距应该是行或列。我想将边距扩大到“对角线” 和“反对角线”。结构看起来像 diagApply <- function(x, FUN,
我找到了 JSON serialization and deserialization to objects in Flutter 的例子但是如何使用像这样的人员列表来做到这一点: [ {
我有一个相当大的terms聚合结果,这些结果被加载到下拉列表中以提供filter功能。 可以说,我的下拉列表中有4000多种动物。我的另一个下拉列表有4种动物颜色。 例, animal --> ["d
我需要将 C# (.NET Framework 4.5.2) 中的一个类与 XML 序列化(反序列化),该类具有 string 的字典属性。键和 string[]数组值。我正在使用 Serializa
[已解决]应用给定的解决方案,效果很好! 程序的目的:在用户打开和关闭程序时保存/重新加载以前的数据。 我曾经用一个对象(obj)成功(反)序列化,现在我有两个不同类的不同对象。 我试图通过查看其他帖
问题 假设我有一个代表某事或其他的枚举: public enum ResultState { Found, Deleted, NotFound } 在我的序列化 json 中,
是否有取消 JSON 字符串的功能?我猜它不会内置到 JQuery 中,但它可以通过编写一个操纵字符串的脚本来实现吗?我在下面遇到了这个问题。 我正在使用 NYTimes API,但它不支持 JSON
对于这个问题,假设当对象完全写入流并成功读出时,或者当对象部分写入流并且读回对象时发生异常时,序列化/反序列化是原子的。假设写操作可能无法成功完成,例如因为停电了。 在Serializable的描述中
有谁知道时序检查是否仍在检测虚拟环境?我尝试使用 rdtsc 指令来获取 cpu 周期并比较真实 linux 机器和在 virtualbox 上运行的 linux 之间的结果。但结果似乎不稳定。有时,
我正在对一个(外部给定的)XML 文件进行操作,该文件具有以下形式的元素 10 20 30 40 50 60 70 80 我知道如何将属性作为属性处理(通过使用 [XmlAttri
我有一个通用的序列化器和反序列化器,用于通过网络连接发送的消息: public static async Task SerializeObject(Object obj) {
我正在考虑将当前基于 WCF 的应用程序迁移到 protobuf-net.Grpc。这似乎是可行的,但是我无法在不包含所有具有 [ProtoInclude] 属性的派生类的情况下使(DTO 类)基类的
我正在尝试将一些数据保存到文件中,但文件保存到的目录不正确。 using (StreamWriter sw = new StreamWriter(dir + "\\temp" + x + ".txt"
我是一名优秀的程序员,十分优秀!