标签: jackson

杰克逊 - 使用泛型类反序列化

我有一个json字符串,我应该deSerialize到下面的类

class Data <T> {
    int found;
    Class<T> hits
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?这是通常的方式

mapper.readValue(jsonString, Data.class);
Run Code Online (Sandbox Code Playgroud)

但我如何提及T代表什么?

java generics json jackson

120
推荐指数
8
解决办法
14万
查看次数

如何使用Jackson JSON处理器序列化Joda DateTime?

如何根据一个简单的模式(如"dd-MM-yyyy")让杰克逊序列化我的Joda DateTime对象?

我试过了:

@JsonSerialize(using=DateTimeSerializer.class)
private final DateTime date;
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

ObjectMapper mapper = new ObjectMapper()
    .getSerializationConfig()
    .setDateFormat(df);
Run Code Online (Sandbox Code Playgroud)

谢谢!

java json jodatime jackson

117
推荐指数
7
解决办法
13万
查看次数

Java 8 LocalDate Jackson格式

对于java.util.Date,当我这样做

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")  
  private Date dateOfBirth;
Run Code Online (Sandbox Code Playgroud)

然后在我发送的JSON请求中

{ {"dateOfBirth":"01/01/2000"} }  
Run Code Online (Sandbox Code Playgroud)

有用.

我应该如何为Java 8的LocalDate字段执行此操作?

我试过了

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;  
Run Code Online (Sandbox Code Playgroud)

它没用.

有人可以让我知道这是正确的方法吗?

以下是依赖项

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>jaxrs-api</artifactId>
     <version>3.0.9.Final</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.3.10</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

java json jax-rs resteasy jackson

110
推荐指数
12
解决办法
15万
查看次数

如何告诉jackson忽略我无法控制源代码的属性?

简而言之,我的一个实体有一个GeometryCollection,当你调用"getBoundary"时会抛出一个异常(为什么这是另一本书,现在让我们说这就是它的工作方式).

有没有办法告诉杰克逊不要包括那个特定的吸气剂?我知道当我拥有/控制代码时我可以使用@JacksonIgnore.但事实并非如此,杰克逊通过连续序列化父对象来达到这一点.我在jackson文档中看到了一个过滤选项.这是一个看似合理的解决方案吗?

谢谢!

java json jackson

108
推荐指数
7
解决办法
16万
查看次数

无法从START_OBJECT标记中反序列化java.util.ArrayList的实例

我正在尝试POST一个List自定义对象.请求正文中的我的JSON是这样的:

{
    "collection": [
        {
            "name": "Test order1",
            "detail": "ahk ks"
        },
        {
            "name": "Test order2",
            "detail": "Fisteku"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

处理请求的服务器端代码:

import java.util.Collection;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;


@Path(value = "/rest/corder")
public class COrderRestService {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response postOrder(Collection<COrder> orders) {
        StringBuilder stringBuilder = new StringBuilder();
        for (COrder c : orders) {
            stringBuilder.append(c.toString());
        }
        System.out.println(stringBuilder);
        return Response.ok(stringBuilder, MediaType.APPLICATION_JSON).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

实体COrder:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class …
Run Code Online (Sandbox Code Playgroud)

java spring jax-rs resteasy jackson

102
推荐指数
7
解决办法
29万
查看次数

如何在Jackson中使用自定义Serializer?

我有两个Java类,我想使用Jackson序列化为JSON:

public class User {
    public final int id;
    public final String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

public class Item {
    public final int id;
    public final String itemNr;
    public final User createdBy;

    public Item(int id, String itemNr, User createdBy) {
        this.id = id;
        this.itemNr = itemNr;
        this.createdBy = createdBy;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将Item序列化为此JSON:

{"id":7, "itemNr":"TEST", "createdBy":3}
Run Code Online (Sandbox Code Playgroud)

用户序列化只包括id.我还可以将所有用户对象serilize为JSON,如:

{"id":3, "name": "Jonas", "email": "jonas@example.com"}
Run Code Online (Sandbox Code Playgroud)

所以我想我需要编写一个自定义序列化器Item并尝试使用它:

public class ItemSerializer …
Run Code Online (Sandbox Code Playgroud)

java serialization json jackson

101
推荐指数
8
解决办法
21万
查看次数

杰克逊如何在不投射的情况下将JsonNode转换为ArrayNode?

我正在将我的JSON库从org.json更改为Jackson,我想迁移以下代码:

JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray =  datasets.getJSONArray("datasets");
Run Code Online (Sandbox Code Playgroud)

现在在杰克逊我有以下内容:

ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));      
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Run Code Online (Sandbox Code Playgroud)

但是我不喜欢那里的演员,是否有可能ClassCastException?是否有一个等效的方法getJSONArray,org.json以便我有适当的错误处理,以防它不是一个数组?

java json jackson

101
推荐指数
3
解决办法
17万
查看次数

如何使用Jackson在对象中包含原始JSON?

当使用Jackson(de)序列化对象时,我试图在Java对象中包含原始JSON.为了测试这个功能,我写了以下测试:

public static class Pojo {
    public String foo;

    @JsonRawValue
    public String bar;
}

@Test
public void test() throws JsonGenerationException, JsonMappingException, IOException {

    String foo = "one";
    String bar = "{\"A\":false}";

    Pojo pojo = new Pojo();
    pojo.foo = foo;
    pojo.bar = bar;

    String json = "{\"foo\":\"" + foo + "\",\"bar\":" + bar + "}";

    ObjectMapper objectMapper = new ObjectMapper();
    String output = objectMapper.writeValueAsString(pojo);
    System.out.println(output);
    assertEquals(json, output);

    Pojo deserialized = objectMapper.readValue(output, Pojo.class);
    assertEquals(foo, deserialized.foo);
    assertEquals(bar, deserialized.bar);
}
Run Code Online (Sandbox Code Playgroud)

代码输出以下行:

{"foo":"one","bar":{"A":false}}
Run Code Online (Sandbox Code Playgroud)

JSON正是我想要看的东西.不幸的是,在尝试将JSON读回到对象时,代码失败并出现异常.这是一个例外:

org.codehaus.jackson.map.JsonMappingException:无法在[来源:java.io.StringReader@d70d7a;中的START_OBJECT标记中反序列化java.lang.String的实例.line:1,column:13](通过参考链:com.tnal.prism.cobalt.gather.testing.Pojo …

java json inner-classes jackson

98
推荐指数
5
解决办法
7万
查看次数

杰克逊和泛型类型参考

我想使用jackson json库作为通用方法,如下所示:

public MyRequest<T> tester() {
    TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();  
    MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
    return requestWrapper.getRequest();
}
Run Code Online (Sandbox Code Playgroud)

...

public class MyWrapper<T> {

    private MyRequest<T> request;

    public MyRequest<T> getRequest() {
        return request;
    }

    public void setRequest(MyRequest<T> request) {
        this.request = request;
    }
}


 public class MyRequest{
     private List<T> myobjects;

     public void setMyObjects(List<T> ets) {
         this.myobjects = ets;
     }

     @NotNull
     @JsonIgnore
     public T getMyObject() {
         return myobjects.get(0);
     }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我调用请求对象内的getMyObject()时,jackson将嵌套的自定义对象作为LinkedHashMap返回.有没有什么方法可以指定需要返回T对象?例如:如果我发送了Customer类型的对象,那么应该从该列表返回Customer?

谢谢.

java generics json jackson

96
推荐指数
2
解决办法
12万
查看次数

如何从Jackson中的自定义反序列化器调用默认反序列化器

我在杰克逊的自定义反序列化器中遇到了问题.我想访问默认的序列化程序来填充我反序列化的对象.在人口之后,我将做一些自定义的事情,但首先我想用默认的jackson行为反序列化对象.

这是我目前的代码.

public class UserEventDeserializer extends StdDeserializer<User> {

  private static final long serialVersionUID = 7923585097068641765L;

  public UserEventDeserializer() {
    super(User.class);
  }

  @Override
  @Transactional
  public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {

    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);
    User deserializedUser = null;
    deserializedUser = super.deserialize(jp, ctxt, new User()); 
    // The previous line generates an exception java.lang.UnsupportedOperationException
    // Because there is no implementation of the deserializer.
    // I want a way to access the default spring deserializer for my …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jackson

92
推荐指数
7
解决办法
4万
查看次数