Что произойдет, если я аннотирую параметр конструктора, используя @JsonProperty, но Json не указывает это свойство.Какое значение получает конструктор?
Для вопросов, подобных этому, я хотел бы просто написать пример программы и посмотреть, что произойдет.
Ниже приведен пример такой программы.
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
// {"name":"Fred","id":42}
String jsonInput1 = "{\"name\":\"Fred\",\"id\":42}";
Bar bar1 = mapper.readValue(jsonInput1, Bar.class);
System.out.println(bar1);
// output:
// Bar: name=Fred, id=42
// {"name":"James"}
String jsonInput2 = "{\"name\":\"James\"}";
Bar bar2 = mapper.readValue(jsonInput2, Bar.class);
System.out.println(bar2);
// output:
// Bar: name=James, id=0
// {"id":7}
String jsonInput3 = "{\"id\":7}";
Bar bar3 = mapper.readValue(jsonInput3, Bar.class);
System.out.println(bar3);
// output:
// Bar: name=null, id=7
}
}
class Bar
{
private String name = "BLANK";
private int id = -1;
Bar(@JsonProperty("name") String n, @JsonProperty("id") int i)
{
name = n;
id = i;
}
@Override
public String toString()
{
return String.format("Bar: name=%s, id=%d", name, id);
}
}
В результате конструктору передается значение по умолчанию для типа данных.
Как отличить свойство, имеющее нулевое значение, от свойства, которого нетв JSON?
Один простой подход заключается в проверке значения по умолчанию после обработки десериализации, поскольку, если элемент присутствовал в JSON, но имел нулевое значение, тогда использовалось бы нулевое значениезаменить любое значение по умолчанию, соответствующее соответствующему полю Java.Например:
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;
public class JacksonFooToo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
// {"name":null,"id":99}
String jsonInput1 = "{\"name\":null,\"id\":99}";
BarToo barToo1 = mapper.readValue(jsonInput1, BarToo.class);
System.out.println(barToo1);
// output:
// BarToo: name=null, id=99
// {"id":99}
String jsonInput2 = "{\"id\":99}";
BarToo barToo2 = mapper.readValue(jsonInput2, BarToo.class);
System.out.println(barToo2);
// output:
// BarToo: name=BLANK, id=99
// Interrogate barToo1 and barToo2 for
// the current value of the name field.
// If it's null, then it was null in the JSON.
// If it's BLANK, then it was missing in the JSON.
}
}
class BarToo
{
String name = "BLANK";
int id = -1;
@Override
public String toString()
{
return String.format("BarToo: name=%s, id=%d", name, id);
}
}
Другой подход заключается в реализации пользовательского десериализатора, который проверяет необходимые элементы JSON.И еще один подход заключается в том, чтобы зарегистрировать запрос на улучшение в проекте Джексона на http://jira.codehaus.org/browse/JACKSON