如何将 toString 值映射到 class?

How to map toString value to the class?

我有一个class。我已经覆盖了 toString 值。现在我想将 toString 输出的值映射到 class。有什么捷径吗?

public class Cat {
    String name;
    int age;
    String color;

    public Cat(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    @Override
    public String toString() {
        return "Cat{" + "name=" + name + ", age="+age+",color="+color+'}';
    }
}`

简而言之,我想将以下值映射到 Cat class

String value = "Cat{name=Kitty,age=1,color=Black}"
Cat cat = // create a 'Cat'from 'value'

提前谢谢你。

您可以使用正则表达式执行此操作:

Pattern catCapture = Pattern.compile(
        "Cat\{name=(?<name>\w*)\s*,\s*age=(?<age>\d+)\s*,\s*color=(?<color>\w*)\}"
    );

String input = "Cat{name=Kitty,age=1,color=Black}";

Matcher matcher = catCapture.matcher(input);
Cat cat;
if(matcher.find()) {
    String name = matcher.group("name");
    int age = Integer.parseInt(matcher.group("age"));
    String color = matcher.group("color");
    cat = new Cat(name, age, color);
} else {
    throw new RuntimeException("Can not parse: " + input);
}

System.out.println(cat); // prints Cat{name=Kitty, age=1,color=Black}

正则表达式将名称、年龄和颜色这 3 个值捕获到组 (?<name>\w*)(?<age>\d+)(?<color>\w*) 中,以便您随后获取它们。不过,您仍然必须将年龄解析为 int。

它还解释了逗号和值使用 \s* 之间的不同数量的白色 space(即 0 个或更多白色 space)。

另见这些:

我想要的 class 终于像这个了。特别感谢@Jorn vernee

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Cat {
    String name;
    int age;
    String color;

    public Cat(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public Cat(String strValue){

        Pattern catCapture = Pattern.compile(
            "Cat\{name=(?<name>\w*)\s*,\s*age=(?<age>\d+)\s*,\s*color=(?<color>\w*)\}"
        );

        Matcher matcher = catCapture.matcher(strValue);

        if(matcher.find()) {
            this.name = matcher.group("name");
            this.age = Integer.parseInt(matcher.group("age"));
            this.color = matcher.group("color");
        } else {
            throw new RuntimeException("Can not parse: " + strValue);
        }
    }

    @Override
    public String toString() {
        return "Cat{" + "name=" + name + ", age=" + age + ", color=" + color + '}';
    }
}

根据您的要求考虑 GSON

来自user guide

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

// Serialization
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);  

还有反序列化,这是您的用例:

// Deserialization
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);

这就是我要找的...谢谢 sujit。

    Cat cat = new Cat("Kitty",1,"Black");
    Gson gson = new Gson();
    String json = gson.toJson(cat);  
    System.out.println(json);

    Cat cat2 = gson.fromJson(json, Cat.class);
    System.out.println(cat2.toString());