从json部分修改java对象

从json部分修改java对象,java,json,parsing,field,gson,Java,Json,Parsing,Field,Gson,我希望能够从JSON字符串修改java对象,而不必指定每个字段。例如: package controller.test; import com.google.gson.Gson; public class Tests { public Tests() { test(); } private void test() { Person realPerson = new Person(); realPerson.setNam

我希望能够从JSON字符串修改java对象,而不必指定每个字段。例如:

package controller.test;

import com.google.gson.Gson;

public class Tests {
    public Tests() {
        test();
    }

    private void test() {
        Person realPerson = new Person();
        realPerson.setName("Bobby");
        realPerson.setAge(28);

        // Now trying to set the name from a JSON string
        Gson gson = new Gson();
        Person modifiedPerson = gson.fromJson("{\"name\":\"Justin\"}", Person.class);

        System.out.println(gson.toJson(realPerson));
        // prints: {"name":"Bobby","age":28}
        System.out.println(gson.toJson(modifiedPerson));
        // prints: {"name":"Justin","age":0}
    }

    public static void main(String[] args) {
        new Tests();
    }
}

class Person {
    private String name;
    private int age;

    public Person() {
    }

    // Getters & setters are added here
}
如何将realPerson.name从“Bobby”修改为“Justin”,而不必指定年龄

对于像这个例子这样的一个小类来说,这并不是什么大问题:我可以单独检查并设置每个字段。但是我的类包含138个不同的字段

编辑:

我的问题可能解释得不好,让我总结一下我的问题:

我有一个类的实例(有大约130个不同的字段,所有字段都设置为单个值)

我希望能够使用JSON字符串修改此实例中的值

JSON字符串示例:{“field13”:“5”,“field100”:“2”}


是否有任何方法可以在不必为java类中的每个字段编写特定代码的情况下完成此操作?

如果可以选择使用Jackson作为反序列化器,则可以使用dataholder中的注释:

@JsonAnySetter
public void set(String name, Object value);
@JsonAnyGetter
public Map<String, Object> get();
@jsonanystetter
公共无效集(字符串名称、对象值);
@JsonAnyGetter
公共映射get();

您查看过本指南吗?我真的不明白在这里该做什么。你能提供一个例子吗?为什么不
realPerson.setName(modifiedPerson.getName())?我的servlet正在为客户端处理对象。客户端必须能够使用带有字符串化JSON对象的POST请求来设置java对象的字段。如果我错了,请纠正我,您有一个包含许多字段的类,并且您希望使用JSON的一部分来反序列化该类的一个实例,仅与一个字段相关。我说的对吗?谢谢你的回复。我真的不明白该怎么做,写一个反序列化程序?这正是我试图避免的。您的建议可以更具体一点吗?当切换到Jackson(而不是gson)作为Json的反序列化器时,您所要做的就是将这两个方法添加到您的数据模型中并对它们进行注释。如果json字符串中出现了一个字段,该字段不在模型中,Jackson将调用通用setter。(或者在序列化的情况下,它将调用泛型getter并添加这些字段)可能会帮助您理解它。通过使用通用字段,您可以对它们进行迭代,而不是单独设置每个字段。dataholder的类不一定用于web应用程序。我最终编写了一个自定义解析器(实际上是编写了一个为我编写的脚本)。我接受你的回答