当前位置: 首页 > 知识库问答 >
问题:

如何将嵌套的JSON映射到简单对象?

窦志新
2023-03-14

我想映射这个JSON数据:

{"information":{
     "type": "typeA",
     "date": "2018-01-15 12:11:53",
     "user":{
         "name": "John"
         "lastName": "Doe"
     }
}}

对于此java对象:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class InformationModel {
    private String name;
    private String lastName;

    private String type;
    private String date;
}

但是它失败了,所有的值都是null。我尝试在type变量上方添加@JsonProperty("information.type"),但没有成功。

是否可以反序列化JSON,使其仅映射到(这个)一个类?

编辑:我使用Spring StreamListener进行如下映射:

@StreamListener(value = Sink.INPUT)
public void on(InformationModel message) throws IOException {
    // some code using message
}

共有3个答案

胡墨竹
2023-03-14

您可以使用Gson。这里有一个很好的教程,您可以利用自定义序列化。

如果您想使用当前的POJO结构,请遵循以下步骤:反序列化json的代码

    GsonBuilder gsonBuilder = new GsonBuilder();

JsonDeserializer<UserDate> deserializer = InformationModelDeserializer() ; 
// implementation detail  
gsonBuilder.registerTypeAdapter(InformationModel .class, deserializer);

Gson customGson = gsonBuilder.create();  
InformationModel customObject = customGson.fromJson(yourJson, InformationModel .class);  

InformationModelDeserializer的代码。Java语言

public class InformationModelDeserializer implements JsonDeserializer<InformationModel > {  
@Override
public InformationModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    //intercept the json to convert it to your desired shape
    JsonObject jsonObject = json.getAsJsonObject();
    JsonObject userJsonObject json.getAsJsonObject("user")


    return new InformationModel (
        userJsonObject.get("name").getAsString(),
        userJsonObject.get("lastname").getAsString(),
        jsonObject.get("type").getAsString(),
        jsonObject.get("date").getAsString(),

    );
}
}

最后把这个@anotaion放在你的InformationModel类@JsonAdapter(InformationModelDeserialize.class)之前

或者轻松地将POJO更改为

Information.java

public class Information {
    private String type;
    private String date;

    private User user;

    //.....
}

使用者Java语言

public class User {
    private String name;
    private String lastName;

  // .....
 }

并且很容易意识到:

Information info=new Gson().fromJson(yourJson,Information.class);
鲁英卫
2023-03-14

我们有几种方法来解决这个问题。如本文所述。我曾尝试使用带注释的映射,但它对我不起作用。工作的是JsonNode,如下所述。

1 InformationModel.java

`@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class InformationModel {
private String type;
private String date;
private String lastName;
private String name;
//getters and setters
}
`

[2] 测试演示。Java语言

    public class TestDemo { 
    public static void main(String args[]) throws JsonParseException,
            JsonMappingException, IOException { 
        ObjectMapper mapper = new ObjectMapper();
        JsonNode j = mapper.readTree(new File("information.json"));
        InformationModel m = new InformationModel();
        m.setType(j.get("information").get("type").textValue());
        m.setDate(j.get("information").get("date").textValue());
        m.setName(j.get("information").get("user").get("name").textValue());
        m.setLastName(j.get("information").get("user").get("lastName").textValue());        
        mapper.writeValue(new File("outputfile.json"), j);
    }
}
钱元徽
2023-03-14

我必须承认,我对Spring了解不多,所以我的回答可能有点离谱,但既然你用java标记了你的问题,下面是我的答案(使用org.json):

String jsonString = "{\"information\":{\"type\": \"typeA\",\"date\": \"2018-01-15 12:11:53\",\"user\":{\"name\": \"John\",\"lastName\": \"Doe\"}}}";

JSONObject o = new JSONObject(jsonString);

JSONObject obj = o.getJSONObject("information");
String date = obj.getString("date");
//map whatever you want to map here.    
System.out.println(date);

显然这是非常基本的,但你明白了。您可能可以使用JSONArray实现同样的事情。

希望有帮助!

 类似资料:
  • POJO类: 控制器: JSON请求: 问题: 当我处理请求时,我收到一个空的TransactionDto对象。 System.out.println(transactionDto) TransactionDto(id=null,userName=null,apiKey=null,amount=0,accountNumber=null,expirationDate=null,cscCode=nul

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?

  • 问题内容: 我在了解如何实现这一目标方面遇到了问题。 基本上我们有一个API,用户发送以下格式的JSON :(如果代码不完美,请原谅,但您可以理解) 好的,我不确定我是否正确设置了JSON格式,但是现在这是我的问题。 我有一个带有参数Name,Last的类,还有一个作为其成员之一的对象Client和Property Date。 像这样: 因此,基本上,我不确定如何获取JSON,然后将其映射到我的对

  • 我有一个restendpoint,它返回3级嵌套json,如下所示: 我有一个java类,没有相同的3个嵌套级别: 当我使用restTemplate拨打rest电话时: jackson甚至没有使用json ignore属性映射字段departName(因为我猜它不在同一嵌套级别)。 如何将这个http json响应映射到忽略嵌套父json的java字段?

  • 这是我的DTO: 这是我的实体: 我想配置我的ModelMapper将Tag#id映射到TagVolumeDTO#idTag。这可能吗?

  • 问题内容: 我们有一张有很多列的大桌子。移至MySQL Cluster后,由于以下原因无法创建表: 错误1118(42000):行大小太大。不包括BLOB在内的已使用表类型的最大行大小为14000。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB 举个例子: 这是用于存储配置参数的表。我在想,我们可以将一些列合并为一个列,并将其存储为JSON对象,然后将其转换为Java对象。 例