如何将 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)。
另见这些:
- Regex api docs
- This SO regex FAQ
我想要的 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。
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());
我有一个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)。
另见这些:
- Regex api docs
- This SO regex FAQ
我想要的 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。
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());