2

我正在为 JSON 使用“org.json”。我可以使用 JSONObject 将任何类序列化为 JSON 字符串。但是,我不确定如何走另一条路。如何将 JSON 字符串反序列化回类实例?

此代码用于序列化它。我使用 JSONObject,并提供字段名称列表作为构造函数的第二个参数 - User.JSONFieldMap()。

    int randomValue = rnd.nextInt(10000);
    String userName = "JavaUnitTest_" + randomValue;
    User newUser = new User();
    newUser.UserName = userName;
    newUser.DisplayName = "Java Unit Test";
    newUser.EmailAddress = userName + "@SomeDomainName.com";
    JSONObject jsonUser = new JSONObject(newUser, User.JSONFieldMap());
    String userStringified = jsonUser.toString();

我不确定如何做,或者是否有可能做这样的事情:

    User myUser = MagicJSONDeserializer.DeserializeIt("{ some JSON string}");

感谢您的帮助,我来自 .net/C#/Microsoft 背景,所以 Java 对我来说非常陌生。

4

2 回答 2

2

该库不直接提供此类功能。您可以使用数百个其他 Java JSON 库中的任何一个,例如 Gson、Jackson 或 flexjson。

这样做的间接方法是从 JSON 中检索每个值,并在将其分配给对象字段之前对该值执行自定义反序列化。

于 2014-07-03T02:52:30.770 回答
0

为对其他解决方案感兴趣的人更新。可以使用com.fasterxml.jackson.databind如下方式实现:

import com.fasterxml.jackson.databind.ObjectMapper;

String userStr = "{ \"NAME\" : \"John\" }";
User user = new ObjectMapper().readValue(userStr, User.class);

它用于ObjectMapperbyte[]或在这种情况下转换String为 java 对象。此解决方案需要正确注释类User,例如使用@JsonProperty注释。否则它将无法将 json 键值与类属性匹配。

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;

public class User {
    @JsonProperty("NAME")
    String name;

    @JsonGetter("NAME")
    public String getName() {
        return name;
    }

    @JsonSetter("NAME")
    public void setName(String name) {
        this.name = name;
    }
}
于 2020-05-25T14:52:17.150 回答