将字符串反序列化为对象

时间:2019-04-25 09:50:11

标签: java

将这种字符串格式转换为对象的最佳方法是什么?

[Start successful - User:Berord; Name:Test; Fruits:Orange; Version:;]

我正在考虑将其与';'分开并执行substring(str.indexOf(“ User:”)+ 1),substring(str.indexOf(“ Name:”)+ 1)

还有其他更好的方法吗?

3 个答案:

答案 0 :(得分:1)

如果用户数据始终采用FieldNameWithoutSpaces:DataWithOutSemicolon的形式;您可以将以下正则表达式与Pattern和Matcher一起使用:(\ S +):([^;] *);并从每个匹配项中提取组1和2。

示例:

private void OnTriggerEnter2D(Collider2D doorTrigger)
{
    if (doorTrigger.gameObject.tag == "Player")
    {
        LoadLevel03 l3 = new LoadLevel03();
        l3.openDoor = true;
    }
}

这将导致以下输出。

Pattern p = Pattern.compile("(\\S+):([^;]*);");
Matcher m= p.matcher( "[Start successful - User:Berord; Name:Test; Fruits:Orange; Version:;]" );
while( m.find() ) {
  String key = m.group( 1 );
  String value = m.group( 2 );
  //put those into a map or use in some other way, for demonstration I'll print them
  System.out.println( key + "::" + value );
}

请注意,键不应该包含空格,而应以至少一个空格开头,否则,您将匹配更多内容,即,如果输入为User::Berord Name::Test Fruits::Orange Version:: ,则您将得到[Start successful-User:Berord;Name:Test;Fruits:Orange; Version:;]和{{ 1}}。以同样的方式,您的值不应包含分号,否则匹配也会被弄乱。

如果您要求空格必须是可选的,并且值可以包含分号,则正则表达式可能会变得更加复杂(取决于要求),甚至根本不合适—在这种情况下,您需要使用(写)更专业的解析器。

答案 1 :(得分:1)

我将逐步分解此String

  1. 以减号({{1)}分隔输入,以便仅访问有趣的部分
  2. 用分号(-)分割此有趣的部分,以获取键值对
  3. 用冒号(;分隔每个键值对,以分别获取键和值

正如评论中已经提到的人一样,您可以使用:存储键值对。
以下代码中进行了多项优化,例如Map<String, String>,用于消除键和值中的前导和尾随空格,某些(可能已过时)检查映射中是否存在键,以及对拆分操作的结果进行一些检查。

这是一个示例解决方案,请阅读注释:

trim()

我从中得到的结果是

  

有一个键或值缺少相应的键或值:“ Version”(用冒号分割只能得到一个String!)
  用户:Berord
  版本:
  名称:测试
  水果:橙色

答案 2 :(得分:0)

分割为;首先,您将获得大小为3的字符串数组,可以对其进行循环并使用:

进行拆分
 String s = "Start successful - User:Berord; Name:Test; Fruits:Orange; Version:;".replace("Start successful -","");

    String splits[]=s.split(";");
    for(String split:splits)
    {
String splittedStrings[] =split.split(":");
    String key = splittedStrings[0];
    String value = splittedStrings[1];
    }