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

Json反序列化到URL(拦截)

郭博涉
2023-03-14

尝试反序列化URL时出现此错误

Caused by: java.net.MalformedURLException: no protocol: www.boo.com
    at java.net.URL.<init>(URL.java:586) ~[na:1.8.0_45]
    at java.net.URL.<init>(URL.java:483) ~[na:1.8.0_45]
    at java.net.URL.<init>(URL.java:432) ~[na:1.8.0_45]
    at com.fasterxml.jackson.databind.deser.std.FromStringDeserializer$Std._deserialize(FromStringDeserializer.java:212) ~[jackson-databind-2.6.2.jar:2.6.2]
    at com.fasterxml.jackson.databind.deser.std.FromStringDeserializer.deserialize(FromStringDeserializer.java:122) ~[jackson-databind-2.6.2.jar:2.6.2]
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520) ~[jackson-databind-2.6.2.jar:2.6.2]
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95) ~[jackson-databind-2.6.2.jar:2.6.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:337) ~[jackson-databind-2.6.2.jar:2.6.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:131) ~[jackson-databind-2.6.2.jar:2.6.2]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) ~[jackson-databind-2.6.2.jar:2.6.2]

波乔:

class foo {
   ...
   URL url
   ...
}

正如错误所说,如果缺少协议,如果用户没有设置协议,如何在反序列化之前插入协议?

共有3个答案

季骏祥
2023-03-14

您可以使用自定义反序列化器(参见另一个答案)。另一个解决方案——不那么优雅,但很简单——是在您的bean中创建一个接受String值的setter,并在创建URL对象之前在内部做一些准备:

private Pattern urlPrefix = Pattern.compile("^(https?://|ftp://).*"); //etc.
//...
public void setUrl(String url) {
    if (url != null && urlPrefix.matcher(url).matches()) {
        this.url = new URL(url);
    } else {
        this.url = new URL("http://" + url);
    }
}
卫高明
2023-03-14

您可以使用自定义反序列化器。有关自定义反序列化器的用法,请参阅此处的自定义JSON反序列化

岳永思
2023-03-14

我结合了之前的两个答案:

public class Foo {
   ...
   @JsonDeserialize(using = UrlDeseralizer.class)
   private URL url;
   ...
}

public class UrlDeseralizer extends JsonDeserializer<URL> {

    private Pattern urlPrefix = Pattern.compile("^(https?://|ftp://).*");

    @Override
    public URL deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectCodec objectCodec = p.getCodec();
        JsonNode node = objectCodec.readTree(p);
        String stringUrl = node.asText();
        if (!urlPrefix.matcher(stringUrl).matches()) {
            return new URL("http://" + stringUrl);
        } else {
            return new URL(stringUrl);
        }
    }

}
 类似资料:
  • 问题内容: 我正在使用大猩猩 websocket,并且正在计划使用json进行序列化/反序列化。 假设我有这样的结构来接收传入的消息: 和 大猩猩提供接收传入的消息。传入的消息可以是Foo或Bar,但是我不能使用和收听其他消息,这很混乱。我想要像javascript 这样的东西。如果接收到Foo,则如何处理传入消息,然后将其存储到结构中;如果接收到Bar,则将其存储到结构中? 我正在解决方案正在使

  • 问题内容: 我很好奇序列化和反序列化的方式。我使用关键字“ json”和“ tuple”进行搜索,但找不到所需的内容。 问题答案: 我通过和Json.net进行测试,测试代码如下。结果显示可序列化和可反序列化。因此,我可以在应用程序中使用它们。 测试代码 注释 在将序列化到字符串{“项目1”:“一”,“项目2”:“嘻嘻”,“项目3”:真正},并且它可以被反序列化回类型。

  • 假设您有一个JSON,它看起来像这样: 使用Scala和类型来表示这一点似乎很自然: 我的问题是:是否可以使用Jackson的Scala模块将上面的JSON序列化为一个? 我的尝试: 例外情况: 线程“main”com.fasterxml.jackson.databind.JsonMappingExctive中的异常:无法构造...项目的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器

  • 问题内容: 我有以下JSON字符串要反序列化: 我正在使用DataContractJsonSerializer方法。 它由项目数组组成,我找不到使用VB.Net可以反序列化此结构的示例。我具有以下Application类来存储此信息: 问题答案: 我建议你使用过。原因如下: 更快 比简单的序列化需要更多的代码。 您无需将and 属性与 使用此数据类 并使用它反序列化您的: 如果仍要使用,则可以使用

  • 我有一个简单的问题,假设我有这个json 以这种方式映射: 我想知道是否可以通过使用一些自定义setter/注释或其他东西在内部对象中保存一个外部字段: PS:由于json的复杂性,使用自定义反序列化是我最后的选择

  • 我想解析这个json文件。 {“特征”:[{“类型”:“特征”,“几何”:“{“类型”:“多边形”,“坐标”:[[26.4217861898109,40.127607984644],[26.4219934821323,40.1275230229872],[26.4218810759267,40.1273800013679],[26.4216801413981,40.1274730404221],[