当每个数组元素中可能有不同的键值对时,是否有人可以提供有关JSON库或代码片段的建议,该代码片段用于处理将下面的JSON文件转换为Java对象?
{
"tweets": [
{
"filter_level": "medium",
"retweeted_status": {
"contributors": null,
"text": "",
"entities": {
"symbols": [
],
"urls": [
],
"hashtags": [
],
"user_mentions": [
]
},
"more data":". . ."
"user": {
"user data":". . .",
. . .
},
},
"contributors": null,
"text": "",
"entities": {
"symbols": [
],
"urls": [
],
"hashtags": [
],
"user_mentions": [
{
"id": 32943506,
"name": "Jazzmen",
"indices": [
3,
17
],
"screen_name": "_PumpsAndJays",
"id_str": "32943506"
}
]
},
"more data":". . .",
"user": {
"user data":". . .",
. . .
},
},
{ //BEGIN NEW ELEMENT, As you can see this next element doesn't have the
"retweeted_status" key, so it's different from the element of the array before.
"filter_level": "medium",
"contributors": null,
"text": "",
"more data like the last element":". . .", . . .
我想转换一个像这样的json对象,由一组" tweets"组成。每个都有信息,但是当数据因元素而略有不同时,我找不到任何关于案例的文档。在这种特定情况下,元素可以是转发或只是普通的推文。我想知道是否有人知道如何使用Jackson,Google Gson等库进行转换?
我已经对此进行了大量研究,阅读了多个教程,多个解析器库的文档,但找不到这样的内容。
答案 0 :(得分:0)
最快的方法是使用以下类:
class Tweets {
public List<Map<String, Object> tweets;
}
使用Jackson并将此类作为所需输出传递将无错误地反序列化JSON,但您需要知道每条推文的字段的确切名称,以便您可以为它们执行.get(“field_name”)。您还需要将值转换为您所知道的值:String,Integer,嵌套对象的Map等。此代码将难以维护。
另一种选择是让Tweet类具有所期望的所有可能值,这些值是您收到的推文对象的所有变体。因此,即使它可能没有为数组中的某些对象提供retweetedStatus,也要添加它。如果输入中没有值,杰克逊只会将该值保留为空。
class Tweets {
public List<Tweet> tweets;
}
class Tweet {
String filterLevel;
RetweetedStatus retweetedStatus;
String text;
// + any other fields you may receive and want to deserialize
}
// + any other classes the define nested objects like RetweetedStatus
如果要忽略json中的任何字段,您甚至可以将Jackson配置为忽略未在您的类中映射的字段。
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
或通过注释课程
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDtoIgnoreUnknown { ... }
您还可以使用注释为变量指定不同于json中的名称:
@JsonProperty("retweeted_status")
public RetweetedStatus retweetedStatus
请注意从下划线更改为camelCase