• ,

task.task33.task3301 Помогите разобраться с Jackson

Привет.
Помогите разобраться с Jackson.
Подключил, значит, я фреймворк Jackson, запилил, где надо аннотации по инструкиям из лекций (поставь аннотацию, сделай конструктор, сделай public). Получилось так:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;

/* 
Первая сериализация в JSON
*/
public class Solution {
    public static void main(String[] args) throws IOException {
        Cat cat = new Cat();
        cat.name = "Murka";
        cat.age = 5;
        cat.weight = 3;

        Dog dog = new Dog();
        dog.name = "Killer";
        dog.age = 8;
        dog.owner = "Bill Jeferson";

        ArrayList<Pet> pets = new ArrayList<>();
        pets.add(cat);
        pets.add(dog);

        StringWriter writer = new StringWriter();
        convertToJSON(writer, pets);
        System.out.println(writer.toString());
        //[{"name":"Murka","age":5,"weight":3},{"name":"Killer","age":8,"owner":"Bill Jeferson"}]
    }

    public static void convertToJSON(StringWriter writer, Object object) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(writer, object);
    }

    @JsonAutoDetect
    public static class Pet {
        String name;
        Pet(){}
    }

    @JsonAutoDetect
    public static class Cat extends Pet {
        int age;
        int weight;
        Cat(){}
    }

    @JsonAutoDetect
    public static class Dog extends Pet {
        int age;
        String owner;
        Dog(){}
    }
}


При запуске, в консоль выводится — [{},{}]
Что не так я делаю?
  • ,

Десериализация коллекций в Jackson, как правильно указать тип объекта коллекции при десериализации?

Никак не могу разобраться, как правильно десериализировать коллекцию, вся проблема в строке System.out.println(resulnList.get(2).getClass());, а именно — после десериализации List состоит не из объектов, которые я туда отправлял, а из объектов LinkedHashMap (на что указывает вывод в консоль). А также по сериализированной строке видно, что никакой информации о типах в строку не записывается, хотя в аннотациях расписано, как следует отмечать классы. Помогите разобраться, чтото я на данном этапе застрял.

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

/*
 * Аннотации JSon для правильного определения
 * классов и типов данных при десериализации
 */
public class JSonTypeConversion {
	@JsonDeserialize(as=ArrayList.class,contentAs=BasicClass.class)
	static List<BasicClass> set = new ArrayList();
	
	public static void main(String[] args) throws Exception{
		
		set.add(new BasicClass("Basic"));
		set.add(new ExtendedClass("Extended","LatName"));
		set.add(new SuperExtendedClass("Super","LastName",456));
		
		ObjectMapper mapper = new ObjectMapper();
		String serializedString = mapper.writeValueAsString(set);
		
		System.out.println(serializedString);
		
		ArrayList resulnList = mapper.readValue(serializedString, ArrayList.class);
		
		System.out.println(resulnList);
                //Десериализируется объект класса LinkedHashMap, а не BasicClass???
		System.out.println(resulnList.get(2).getClass());
		
	}

}
/*
 * Иерархия классов для экспериментов
 */
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  property="className")
@JsonSubTypes.Type(value=BasicClass.class, name="BasicClass")
class BasicClass{
	
	public String name;

	public BasicClass(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "basicClass [name=" + name + "]";
	}
	
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  property="className")
@JsonSubTypes.Type(value=ExtendedClass.class, name="ExtendedClass")
class ExtendedClass extends BasicClass{
	public String lastName;
	
	public ExtendedClass(String name,String lastName) {
		super(name);
		this.lastName = lastName;
	}

	@Override
	public String toString() {
		return "extendedClass [lastName=" + lastName + ", name=" + name + "]";
	}
	
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  property="className")
@JsonSubTypes.Type(value=SuperExtendedClass.class, name="SuperExtendedClass")
class SuperExtendedClass extends ExtendedClass{
	
	public int id;
	
	public SuperExtendedClass(String name,String lastName, int id) {
		super(lastName, name);
		this.id = id;
	}

	@Override
	public String toString() {
		return "superExtendedClass [id=" + id + ", lastName=" + lastName + ", name=" + name + "]";
	}
	
}
  • ,

Десериализация коллекций в Jackson, ошибка в определении типов

Никак не могу разобраться, как правильно десериализировать коллекцию, вся проблема в строке System.out.println(resulnList.get(2).getClass());, а именно — после десериализации List состоит не из объектов, которые я туда отправлял, а из объектов LinkedHashMap (на что указывает вывод в консоль). А также по сериализированной строке видно, что никакой информации о типах в строку не записывается, хотя в аннотациях расписано, как следует отмечать классы. Помогите разобраться, чтото я на данном этапе застрял.

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

/*
 * Аннотации JSon для правильного определения
 * классов и типов данных при десериализации
 */
public class JSonTypeConversion {
	@JsonDeserialize(as=ArrayList.class,contentAs=BasicClass.class)
	static List<BasicClass> set = new ArrayList();
	
	public static void main(String[] args) throws Exception{
		
		set.add(new BasicClass("Basic"));
		set.add(new ExtendedClass("Extended","LatName"));
		set.add(new SuperExtendedClass("Super","LastName",456));
		
		ObjectMapper mapper = new ObjectMapper();
		String serializedString = mapper.writeValueAsString(set);
		
		System.out.println(serializedString);
		
		ArrayList resulnList = mapper.readValue(serializedString, ArrayList.class);
		
		System.out.println(resulnList);
                //Десериализируется объект класса LinkedHashMap, а не BasicClass???
		System.out.println(resulnList.get(2).getClass());
		
	}

}
/*
 * Иерархия классов для экспериментов
 */
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  property="className")
@JsonSubTypes.Type(value=BasicClass.class, name="BasicClass")
class BasicClass{
	
	public String name;

	public BasicClass(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "basicClass [name=" + name + "]";
	}
	
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  property="className")
@JsonSubTypes.Type(value=ExtendedClass.class, name="ExtendedClass")
class ExtendedClass extends BasicClass{
	public String lastName;
	
	public ExtendedClass(String name,String lastName) {
		super(name);
		this.lastName = lastName;
	}

	@Override
	public String toString() {
		return "extendedClass [lastName=" + lastName + ", name=" + name + "]";
	}
	
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  property="className")
@JsonSubTypes.Type(value=SuperExtendedClass.class, name="SuperExtendedClass")
class SuperExtendedClass extends ExtendedClass{
	
	public int id;
	
	public SuperExtendedClass(String name,String lastName, int id) {
		super(lastName, name);
		this.id = id;
	}

	@Override
	public String toString() {
		return "superExtendedClass [id=" + id + ", lastName=" + lastName + ", name=" + name + "]";
	}
	
}

Сериализация в Jackson. Как указать явно какой подкласс использовать?

Прочитав лекции на уровне 33, не могу понять, как при сериализации в JSON с помощью Jackson, указать для классов с одинаковыми полями дополнительно поле, type, как это сделать в лекции 4.



Указываю, что хочу ввести поле type, но ничего не происходит. Подскажите, пожалуйста, что я делаю не так?

public class Solution {
public static void main(String[] args) throws IOException {
Cat cat = new Cat ();
cat.name = «Murka»;
cat.age = 5;
cat.weight = 3;

Dog dog = new Dog ();
dog.name = «Killer»;
dog.age = 8;
dog.owner = «Bill Jeferson»;

ArrayListpets = new ArrayList();
pets.add(cat);
pets.add(dog);

StringWriter writer = new StringWriter();
convertToJSON(writer, pets);
System.out.println(writer.toString());
//[{«name»:«Murka»,«age»:5,«weight»:3},{«name»:«Killer»,«age»:8,«owner»:«Bill Jeferson»}]
}

public static void convertToJSON(StringWriter writer, Object object) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(writer, object);
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = «type»)
@JsonSubTypes({
@JsonSubTypes.Type(value = Cat.class, name = «cat»),
@JsonSubTypes.Type(value = Dog.class, name = «dog»)
})
public static class Cat extends Pet
{
public int age;
public int weight;
}

public static class Dog extends Pet
{
public int age;
public String owner;
}

public static class Pet
{
public String name;
}
}

Подключение библиотеки Jackson в 33-ем уровне

Всем привет!

Дошёл до 33-его уровня, лекций по JSON. В лекции указана ссылка для скачивания этого фреймворка, но описывается как его подключить.

Для начала тебе надо скачать этот фреймворк и добавить его себе в проект. Делать это надо в Intellij IDEA само собой. Скачать проект можно по ссылке.

Ссылка введет на страницу с 3-мя элементами:
— Jackson Databind
— Jackson Core
— Jackson Annotations

Какой из них качать, не понятно(( Скорее всего все. По клику на каждый элемент, ссылки для скачивания нет.

Это ведь репозиторий Maven. То есть только через Maven можно добавить Jackson в свой проект?
Подскажите, пожалуйста, как это сделать?