简体   繁体   English

如何对包含多个字符串的字符串进行子串

[英]how to substring a string containing multiple strings

I have a string object which contains multiple strings..I want to extract the part after "_json": till it reaches } But when I give this in my code , it is telling index out of bound exception.我有一个包含多个字符串的字符串对象..我想在“_json”之后提取部分直到它到达}但是当我在我的代码中给出这个时,它告诉索引超出界限异常。 Can anybody help to extract that part The string which I am getting is任何人都可以帮助提取那部分我得到的字符串是

===Username===>>{"profile":{"id":"xxxxxx","name":{},"_raw":"{\"sub\":\"xxxxx\",\"country\":\"US\",\"firstname\":\"xxxx\",\"employeetype\":\"XXXX\",\"mail\":\"abc@yz.com\",\"gehrbusinesssegment\":\"avav\",\"gessobusinessunit\":\"AVI DT-xxxxx Engineering\",\"gessouid\":\"C2B0A5EB-8A20-170F-BF3E-002128B20D70\",\"cn\":\"Saha, Romit\",\"title\":\"Project Manager  (Backend)\",\"georaclehrid\":\"xxxxx\",\"lastname\":\"Saha\",\"uid\":\"xxxxx\",\"groupNAME\":[\"@GE AWS_bu-readonly_175070699551\",\"@GE AWS_bu-readonly_639624358806\",\"@AVIATION MRO Fulfillment Operations Advisor\",\"@POWER pge_role_super_user_dev\",\"@AVIATION DISE Friends of the Family\",\"@AVIATION MOA Users - Editor Access\",\"@AVIATION MOA-Viewer-Users\",\"@Gas Power Smartshop Users\",\"@AVIATION US VPN GROUP\",\"@Digital Emergency Change Notification 23\"],\"gessocompanyname\":\"XXXXXX\",\"gehrindustrygroup\":\"XXXXXX\",\"gessojobfunction\":\"Information Technology\",\"street\":\"XXXXXPlaza\",\"location\":\"XXXX\",\"state\":\"XXX\",\"geECIndicator\":\"N\"}\r\n","_json":{"sub":"XXXX","country":"US","firstname":"Romit","employeetype":"XXX","mail":"XXX@ge.com","gehrbusinesssegment":"XXX","gessobusinessunit":"AVI DT-Data Infrastructure & Software Engineering","gessouid":"C2B0A5EB-8A20-170F-BF3E-002128B20D70","cn":"Saha, Romit","title":"XXXXXX(Backend)","georaclehrid":"XXXX","lastname":"Saha","uid":"502622018","groupNAME":["@GE AWS_bu-readonly_175070699551","@GE AWS_bu-readonly_639624358806","@AVIATION MRO Fulfillment Operations Advisor","@POWER pge_role_super_user_dev","@AVIATION DISE Friends of the Family","@AVIATION MOA Users - Editor Access","@AVIATION MOA-Viewer-Users","@Gas Power Smartshop Users","@AVIATION US VPN GROUP","@Digital Emergency Change Notification 23"],"gessocompanyname":"XXXXX","gehrindustrygroup":"GE Aviation","gessojobfunction":"Information Technology","street":"XXXXX Plaza","location":"XXXX","state":"XXX","geECIndicator":"N"}},"accessTokenExp":1627090679000,"accessToken":"XXXXX","refreshTokenExp":1627105079000,"refreshToken":"XXXXX","user_info":{"family_name":"Saha","given_name":"Romit","user_name":"XXXXX"}}

But when I give this in my code, it is giving the exception但是当我在代码中给出这个时,它给出了例外

String json = username.substring(username.indexOf("_json") + 1, username.indexOf('}'));

Error:错误:

2021-07-23 20:37:42 [http-nio-9090-exec-1] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet].log - Servlet.service() for servlet [dispatcherServlet] in context with path [/moa/api/v1] threw exception
java.lang.StringIndexOutOfBoundsException: String index out of range: -1137
        at java.lang.String.substring(String.java:1967) ~[na:1.8.0_251]
        at com.ge.digital.oa.common.config.cloud.oidc.OIDCRequestFilter.doFilterInternal(OIDCRequestFilter.java:80) ~[main/:na]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) ~[spring-security-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]

as input string has multiple } , the being index and end index of substring is out of range由于输入字符串有多个} ,子字符串的正在索引和结束索引超出范围

your current begin index: 1189 end index 53 which results in StringIndexOutOfBoundsException:您当前的开始索引: 1189结束索引53导致StringIndexOutOfBoundsException:

change username.indexOf("}") to username.lastIndexOf("}")username.indexOf("}")更改为username.lastIndexOf("}")

you can try to get lastIndex of '}'你可以尝试获取'}'的lastIndex

         int begin = username.indexOf("_json") +1;
         int end = username.lastIndexOf("}");
         System.out.println("begin:"+begin+" end:"+end );
         String json = username.substring(begin, end);
         System.out.println(" jsonString: "+json);

Output:输出:

jsonString: json":{"sub":"502622018","country":"US","firstname":"Romit","employeetype":"Contractor","mail":"romit.saha@ge.com","gehrbusinesssegment":"Aviation Digital Technology","gessobusinessunit":"AVI DT-Data Infrastructure & Software Engineering","gessouid":"C2B0A5EB-8A20-170F-BF3E-002128B20D70","cn":"Saha, Romit","title":"Predix Senior Engineer (Backend)","georaclehrid":"502622018","lastname":"Saha","uid":"502622018","groupNAME":["@GE AWS_bu-readonly_175070699551","@GE AWS_bu-readonly_639624358806","@AVIATION MRO Fulfillment Operations Advisor","@POWER pge_role_super_user_dev","@AVIATION DISE Friends of the Family","@AVIATION MOA Users - Editor Access","@AVIATION MOA-Viewer-Users","@Gas Power Smartshop Users","@AVIATION US VPN GROUP","@Digital Emergency Change Notification 23"],"gessocompanyname":"General Electric Company","gehrindustrygroup":"GE Aviation","gessojobfunction":"Information Technology","street":"3200 Windy Hill Road, The Towers at Wildwood Plaza","location":"Atlanta","state":"GA","geECIndicator":"N"}},"accessTokenExp":1627090679000,"accessToken":"0003Kpc7Av3noCCKZrKpcSgPnRb2","refreshTokenExp":1627105079000,"refreshToken":"v4Qx3JcAd99zmZnd5WgvYJw83KHBUkAbnb9Ogn02jS","user_info":{"family_name":"Saha","given_name":"Romit","user_name":"502622018"}

Update:更新:

i would recommend using ObjectMapper to convert jsonstring to POJO and access values from object我建议使用 ObjectMapper 将 jsonstring 转换为 POJO 并从对象访问值

convert json string to pojo using tools使用工具将 json 字符串转换为 pojo

passing userName json string to below code will map json string to java object Root you can access required data from respective members Here root.getProfile().get_json() will get you _json将用户名 json 字符串传递给下面的代码会将 json 字符串映射到 java 对象Root您可以从各自的成员访问所需的数据 这里root.getProfile().get_json()会得到你_json

ObjectMapper om = new ObjectMapper();
Root root = om.readValue(userName), Root.class);

your pojos are as below你的 pojos 如下

public class Name{
}


public class Json{
    public String sub;
    public String country;
    public String firstname;
    public String employeetype;
    public String mail;
    public String gehrbusinesssegment;
    public String gessobusinessunit;
    public String gessouid;
    public String cn;
    public String title;
    public String georaclehrid;
    public String lastname;
    public String uid;
    public List<String> groupNAME;
    public String gessocompanyname;
    public String gehrindustrygroup;
    public String gessojobfunction;
    public String street;
    public String location;
    public String state;
    public String geECIndicator;
}

public class Profile{
    public String id;
    public Name name;
    public String _raw;
    public Json _json;
}

public class UserInfo{
    public String family_name;
    public String given_name;
    public String user_name;
}

public class Root{
    public Profile profile;
    public long accessTokenExp;
    public String accessToken;
    public long refreshTokenExp;
    public String refreshToken;
    public UserInfo user_info;
}

another suggestion is you can mask private data before posting question另一个建议是您可以在发布问题之前屏蔽私人数据

You can extract that value using simple-json library like this:您可以使用simple-json库提取该值,如下所示:

JSONObject jobj = (JSONObject) parser.parse(yourJsonString); 
    
        String _json= (String) jobj.get("_json"); // Extract the value from your key
    
        System.out.println(_json);

This is happening because when you say username.indexOf('}') , it is taking the first '}', which is before the '_json' index in the username string.发生这种情况是因为当您说username.indexOf('}') ,它采用第一个 '}',它在用户名字符串中的 '_json' 索引之前。 This gives a StringIndexOutOfBoundsException because the end index (second parameter of the substring method) needs to be after the start index (first parameter of the substring method).这给出了StringIndexOutOfBoundsException因为结束索引( substring方法的第二个参数)需要在开始索引( substring方法的第一个参数)之后。

What you instead have to do is username.split('_json') , then call username.indexOf('}') on the second half of the result from the split call to get the index of the first '}' character after the '_json'.您需要做的是username.split('_json') ,然后在 split 调用结果的后半部分调用username.indexOf('}')以获取第一个 '}' 字符的索引'_json'。 Then you can just do username.substring(username.indexOf("_json") + 1, /*insert the index of the '}' character you found earlier here */) .然后你就可以做username.substring(username.indexOf("_json") + 1, /*insert the index of the '}' character you found earlier here */)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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