gpt4 book ai didi

从 .NET 序列化字符串反序列化时出现 Android MalformedJsonException

转载 作者:行者123 更新时间:2023-11-30 00:38:28 29 4
gpt4 key购买 nike

我正在尝试使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com