Джексон-JsonLD вложенные объекты - PullRequest
0 голосов
/ 07 июня 2018

Я хочу запрограммировать спокойный API и аннотировать свои данные с schema.org.Для этого я хотел использовать Джексона-Jsonld.Обозначать простые объекты с помощью jackson-jsonld не составило труда, но сложные объекты с вложенными объектами застряли.В моем jsonld простые атрибуты, такие как id, name были аннотированы, а вложенное местоположение - нет.

Я читал о сериализации и о том, что она должна помочь получить второй объект.Однако после реализации моей части сериализации кажется, что сериализация ничего не изменила.Вот мой пример вывода, тип для местоположения должен быть PostalAddress, однако тип отсутствует:

{"@context":
    {"uri":"http://schema.org/url","name":"http://schema.org/name","location":"http://schema.org/location"},
    "@type":"http://schema.org/Organization",
    "uri":"http://localhost:8080/kangarooEvents/venue/12",
    "name":"Joondalup Library - Ground Floor Meeting Room",
    "location":{
         "address":"102 Boas Avenue",
         "city":"Joondalup",
         "zip":"6027",
         "country":"Australia",
         "state":"WA"},
    "@id":12}

Я хочу аннотировать организацию, которая имеет одно местоположение:

@JsonldType("http://schema.org/Organization")
public class Venue {
    @JsonldId
    private Integer id;
    @JsonldProperty("http://schema.org/url")
    private String uri;
    @JsonldProperty("http://schema.org/name")
    private String name;
    @JsonSerialize(using = CostumLocationSerializer.class)
    @JsonldProperty("http://schema.org/location")
    private Location location;

Местоположение:

@JsonldType("http://schema.org/PostalAddress")
public class Location {
    @JsonldProperty("http://schema.org/streetAddress")
    private String address;
    @JsonldProperty("http://schema.org/addressLocality")
    private String city;
    @JsonldProperty("http://schema.org/addressRegion")
    private String state;
    @JsonldProperty("http://schema.org/addressRegion")
    private String country;
    @JsonldProperty("http://schema.org/postalCode")
    private String zipcode;

Сериализация:

 public class CostumLocationSerializer extends StdSerializer<Location> {
      private ObjectMapper mapper = new ObjectMapper();

      public CostumLocationSerializer(){
         this( null);

      }
      protected CostumLocationSerializer(Class<Location> t) {
          super(t);
      }

      @Override
     public void serialize(Location location, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
         jsonGenerator.writeStartObject();
         jsonGenerator.writeStringField("address", location.getAddress());
         jsonGenerator.writeStringField("city", location.getCity());
         jsonGenerator.writeStringField("zip", location.getZipcode());
         jsonGenerator.writeStringField("country", location.getCountry());
         jsonGenerator.writeStringField("state", location.getState());
         jsonGenerator.writeEndObject();
         String serialized = mapper.writeValueAsString(location);
     } 
}

Я думаю, что моя проблема может быть в сериализации, но я не могу понять это.Может быть, кто-то комментирует вложенный объект.и можете сказать мне, в чем моя проблема.

1 Ответ

0 голосов
/ 10 сентября 2018

Просто пропустите часть jackson-jsonld и сделайте это вручную

  1. Создайте JSON - просто введите поле для type и id в ваши классы Java.
  2. Создание контекста JSON-LD - сопоставление полей id и type в дополнительном объекте @context
  3. Объединение контекста и данных - например, просто добавьте ваш объект @context после вашей «обычной» сериализации json с использованием стандартного API Джексона.

Пример

@Test
public void createJsonFromPojo() throws Exception {
    ObjectMapper mapper=new ObjectMapper();
    // Create object structure
    Venue venue = new Venue();
    venue.location = new Location();
    venue.id="12";
    venue.uri="http://localhost:8080/kangarooEvents/venue/12";
    venue.name="Joondalup Library - Ground Floor Meeting Room";
    venue.location.address="102 Boas Avenue";
    venue.location.city="Joondalup";
    venue.location.state="WA";
    venue.location.country="Australia";
    venue.location.zipcode="6027";

    //1. Create JSON 
    ObjectNode myData = mapper.valueToTree(venue);

    //2. Create a JSON-LD context
    ArrayNode context = mapper.createArrayNode();
    context.add("http://schema.org/");
    ObjectNode myContext=mapper.createObjectNode();
    myContext.put("id", "@id");
    myContext.put("type", "@type");
    context.add(myContext);

    //3. Combine context and data
    myData.set("@context",context);

    //4. Print
    StringWriter w = new StringWriter();
    mapper.configure(SerializationFeature.INDENT_OUTPUT, true).writeValue(w, myData);
    String result= w.toString();
    System.out.println(result);
}

public class Venue {
    public final String type = "http://schema.org/Organization";
    public String id;
    public String uri;
    public String name;
    public Location location;
}

public class Location {
    public final String type = "http://schema.org/PostalAddress";
    public String address;
    public String city;
    public String state;
    public String country;
    public String zipcode;
}

Дает вам

{ 
    "@context": [
        "http://schema.org/",
        {
          "id": "@id",
          "type":"@type"
        }
     ],
     "uri":"http://localhost:8080/kangarooEvents/venue/12",
     "name":"Joondalup Library - Ground Floor Meeting Room",
     "location":{
         "address":"102 Boas Avenue",
         "city":"Joondalup",
         "zip":"6027",
         "country":"Australia",
         "state":"WA",
         "type":"http://schema.org/PostalAddress"
      },
      "id":"12",
      "type":"http://schema.org/Organization"
}

Просмотреть пример на игровой площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...