[英]getting an object data inside an object in java
我有斧头 object,里面包含一个 object,我想通过一种无需额外写入代码的方法来访问它。 假设这是我的 object:
{
"status": "Success",
"code": "200 OK",
"message": "OK",
"data": {
"renter": {
....some Hashmap information.......
}
}
}
假设我想访问 object 数据中的 object 租户带来的信息。 为了那个原因
在我的方法 Y 中,我这样做了:
@Override
public Y methodY(String userName) throws Exception{
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> clienteFeignOnMap= client.findByRenterName(userName);
//////////ACCESSING THE OBJECT DATA//////////////////
Map<String,Object> objectResponseData= (Map<String, Object>) clienteFeignOnMap.get("data");
//////////ACCESSING THE OBJECT RENTER INSIDE DATA FOR DESERIALIZING TO TyPE RENTER//////////////////
Renter renter = mapper.convertValue(objectResponseData.get("renter"), new TypeReference<Renter>(){ });
......more code.............
}
这种方式是成功的并且有效,但我仍然认为我可以找到一个更好的选择,让我在一条线上恢复从内部 object 租用者的访问。
提前感谢您的任何帮助或建议。 2021新年快乐
If you don't want to create a Java class to map the attributes as @Migwel suggested and want to use java.util.Map
, then you may have to use Apache BeanUtils or something equivalent to get to deep elements.
BeanUtils.getNestedProperty( map, elementPath )
其中elementPath
是元素的点分隔路径。 data.renter
,在你的情况下。
PropertyUtils.getNestedProperty( map, elementPath )
也做同样的事情。
但是,如果您在对象中有 arrays,这些将不允许您访问索引属性。 为此,据我所知,您必须编写类似于以下方法的自定义代码。
public static <T> T getMapElement( Map<String, ? super Object> map, String path ) {
if( isEmpty( path ) ) return null;
String[] parts = path.split( "[\\[\\]\\.]" );
Object currElem = null;
try{
currElem = map;
for( int i = 0; i < parts.length; i++ ){
String part = parts[ i ];
boolean done = false;
/* Handle List. */
if( currElem instanceof List ) {
int index = integer( part, -1 );
if( index >= 0 ) {
currElem = ( (List) currElem ).get( index );
done = true;
}
}
if( done ) continue;
/* Handle Map. */
if( currElem instanceof Map ) currElem = ( (Map) currElem ).get( part );
if( currElem == null ) break;
};
}
catch( Exception e ){}
return (T) currElem;
}
还有来自组com.jayway.jsonpath
的json-path
,它还允许将 JSON 直接检查到深层元素中。 免责声明:我没有使用并且不确定它用于反序列化 JSON。 但是,它可能值得研究。
您应该创建适当的对象,而不是使用地图。
例如:
public class Response {
private String status;
private String code;
private String message;
private Data data;
// constructor, getters, setters
...
}
依此类推,带有 class Data
和 class Renter
等。
然后,在使用 objectMapper 时,您可以直接将其反序列化为您的 Response object
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.