Object Class:
class User{
public String name;
public String password;
}
JSON:
{ sc:"200", msg:"something", userInfo:{name:"n", password:"p"} }
I want to get results like this:
Map->contains 3 key-value
"sc"="200"
"msg"="something"
"userInfo"=User(Object Class)
How can I do this? Or, how can I get it to use another JAR tools package?
You have to choose if you want "untyped" (Maps, Lists, wrappers), which are easy enough to get:
Map<String,Object> map = new ObjectMapper().readValue(json, Map.class);
or POJOs. The thing is, mapper really can't know that you want "userInfo" to map to a specific object, but other values to something else.
But I would rather just create another class, like:
public class Request {
public int sc;
public String message;
public User userInfo;
// and/or getters, setters, if you prefer
}
and bind to that:
Request req = new ObjectMapper().readValue(json, Request.class);
Why mess with inconvenient Maps when you can have real POJOs, right? :)
As a slight modification of StaxMan's answer, if it's somehow desirable to have everything that is not the User
object in a map, Jackson provides the @JsonAnySetter and @JsonAnyGetter annotations to get the job done. The following example demonstrates how this might be used.
import java.util.HashMap;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
// {"sc":"200","msg":"something","userInfo":{"name":"n","password":"p"}}
String jsonInput = "{\"sc\":\"200\",\"msg\":\"something\",\"userInfo\":{\"name\":\"n\",\"password\":\"p\"}}";
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
Result result = mapper.readValue(jsonInput, Result.class);
System.out.println(result);
// output:
// Result: userInfo=User: name=n, password=p, otherThings={sc=200, msg=something}
}
}
class Result
{
Map otherThings = new HashMap();
User userInfo;
@JsonAnySetter
void addThing(String key, Object value)
{
otherThings.put(key, value);
}
@Override
public String toString()
{
return String.format("Result: userInfo=%s, otherThings=%s", userInfo, otherThings);
}
}
class User
{
String name;
String password;
@Override
public String toString()
{
return String.format("User: name=%s, password=%s", name, password);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With