繁体   English   中英

在 java 中的 object 中获取 object 数据

[英]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.jsonpathjson-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM