Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用json将类转换为另一个类(Jackson框架)_Java_Json_Jackson - Fatal编程技术网

Java 使用json将类转换为另一个类(Jackson框架)

Java 使用json将类转换为另一个类(Jackson框架),java,json,jackson,Java,Json,Jackson,两个类有相似的字段,但它们没有超类。在我的代码中:First和Second类。我需要编写方法转换到另一个,该方法将返回类resultClassObject的对象,其中包含objectone中的字段值。 这两个类都有Json注释。该注释具有小写形式的属性值等于类的名称(在我的代码类中FirsthaveclassName=“First”) 可能存在另一个决定?使用jackson实现这一点的唯一正确方法是将实例转换为json,然后解组。我建议在java对象级别使用转换-使用Dozer:对于此类任务,使

两个类有相似的字段,但它们没有超类。在我的代码中:
First
Second
类。我需要编写方法
转换到另一个
,该方法将返回类
resultClassObject
的对象,其中包含object
one
中的字段值。 这两个类都有Json注释。该注释具有小写形式的属性值等于类的名称(在我的代码类中
First
have
className=“First”


可能存在另一个决定?

使用jackson实现这一点的唯一正确方法是将实例转换为json,然后解组。我建议在java对象级别使用转换-使用Dozer:

对于此类任务,使用Dozer()之类的对象映射器是正确的

您可以在不进行字符串操作的情况下替换className的值

ObjectReader reader = mapper.reader();

JsonNode node = reader.readTree(writer.toString());

((ObjectNode)node).put("className",resultClassObject.getSimpleName().toLowerCase());
另外,如果您不知道存储类名称的字段的名称,但知道它在注释中,您可以尝试从JsonNode获取第一个字段(在代码中,您假设字段名称为“className”,但如果不是,该怎么办)

ObjectMapper mapper1=新的ObjectMapper();
Map result=mapper1.convertValue(节点,Map.class);
字符串key1=result.keySet().toArray()[0].toString();

现在您可以替换key1字段的值,该字段应该是存储类名的字段。

我想提供这样一种解决方案,例如class First:

First first = new First();
first.i = 1;
first.name = "first";
Second s = (Second) convertOneToAnother(first, Second.class);
System.out.println(s.name); // first

ObjectMapper mapper = new ObjectMapper();

// here we disable uses annototions, since by the condition of the 
// problem, we have two classes have similar fields
mapper.disable(MapperFeature.USE_ANNOTATIONS);

StringWriter writer = new StringWriter();
mapper.writeValue(writer, one);
//writer.toString() == {"i":1,"name":"first"}

mapper.readValue(writer.toString, resultClassObject);

如果我们不使用方法mapper.disable(),我们将有一个writer,比如字符串
{“className”:“first”,“i”:1,“name”:“first”}

您可以为模型映射编写如下代码:

public class ModelConverter {

public static void main(String[] args) throws IOException {
    Test1 t1 = new Test1();
    ObjectMapper mapper1 = new ObjectMapper();
    String jsonString = mapper1.writeValueAsString(t1);
    System.out.println(jsonString);
    Test2 t2 = mapper1.readValue(jsonString, Test2.class);
    System.out.println(t2);
}
}
public class Test1 implements Serializable {
private int i = 10;
private String name = "demo1";
private Test3 test3 = new Test3();

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Test3 getTest3() {
    return test3;
}

public void setTest3(Test3 test3) {
    this.test3 = test3;
}

@Override
public String toString() {
    return "test1 [i=" + i + ", name=" + name + ", Test3=" + test3 + "]";
}
}
public class Test2 implements Serializable {
private int i = 11;
private String name = "demo2";
private Test3 test3;

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Test3 getTest3() {
    return test3;
}

public void setTest3(Test3 test3) {
    this.test3 = test3;
}

@Override
public String toString() {
    return "test2 [i=" + i + ", name=" + name + ", Test3=" + test3 + "]";
}
}

public class Test3 implements Serializable {
private int i = 12;
private String name = "demo3";

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "test3 [i=" + i + ", name=" + name + "]";
}
}

您不能手工编写转换方法吗?一种接受
First
作为参数并返回
Second
的方法,反之亦然?Json映射器(并使用反射)如果您需要一些通用的东西,这很好,但速度会很慢。如果您不打算经常使用它,这不是问题。其他通用选项是手动使用反射,然后您不需要转换为字符串。当然可以,但我的任务需要使用Json。首先,我尝试使用
mapper.convertValue转换类(一,resultClassObject);
和get Exception:
java.lang.IllegalArgumentException:无法将类型id“first”解析为[simple type,class com.javarush.test.level33.lesson05.home04.Solution$Second]的子类型。
据我所知,需要将
id
从“first”更改为“Second”它将起作用,但此代码未通过验证程序的测试。您关于假设字段名为
className
的问题是有效的,但放得不好。为了提高回答的质量,我建议您在第二个代码段中仍然使用
className
,并将括号内注释的内容更改为
(在您的代码中,您假定字段名为“className”,但如果您愿意,您可以调用任何其他名称)
。我不想说您可以按照您的意愿调用它。问题中没有提到字段名为“className”。“该注释的属性值等于小写的类名”-就是这样,名称字段不是固定的,也不是由转换函数控制的欢迎使用so,我们感谢您的输入!请编辑您的答案,并解释一下您正在做什么以及为什么?有关更多指导,请参阅我更改了我的答案
First first = new First();
first.i = 1;
first.name = "first";
Second s = (Second) convertOneToAnother(first, Second.class);
System.out.println(s.name); // first

ObjectMapper mapper = new ObjectMapper();

// here we disable uses annototions, since by the condition of the 
// problem, we have two classes have similar fields
mapper.disable(MapperFeature.USE_ANNOTATIONS);

StringWriter writer = new StringWriter();
mapper.writeValue(writer, one);
//writer.toString() == {"i":1,"name":"first"}

mapper.readValue(writer.toString, resultClassObject);
public class ModelConverter {

public static void main(String[] args) throws IOException {
    Test1 t1 = new Test1();
    ObjectMapper mapper1 = new ObjectMapper();
    String jsonString = mapper1.writeValueAsString(t1);
    System.out.println(jsonString);
    Test2 t2 = mapper1.readValue(jsonString, Test2.class);
    System.out.println(t2);
}
}
public class Test1 implements Serializable {
private int i = 10;
private String name = "demo1";
private Test3 test3 = new Test3();

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Test3 getTest3() {
    return test3;
}

public void setTest3(Test3 test3) {
    this.test3 = test3;
}

@Override
public String toString() {
    return "test1 [i=" + i + ", name=" + name + ", Test3=" + test3 + "]";
}
}
public class Test2 implements Serializable {
private int i = 11;
private String name = "demo2";
private Test3 test3;

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Test3 getTest3() {
    return test3;
}

public void setTest3(Test3 test3) {
    this.test3 = test3;
}

@Override
public String toString() {
    return "test2 [i=" + i + ", name=" + name + ", Test3=" + test3 + "]";
}
}

public class Test3 implements Serializable {
private int i = 12;
private String name = "demo3";

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "test3 [i=" + i + ", name=" + name + "]";
}
}