gpt4 book ai didi

Java:Jackson 数据绑定(bind)无法从 JSON 文件映射整个类

转载 作者:行者123 更新时间:2023-12-01 12:56:34 24 4
gpt4 key购买 nike

我正在尝试将 JSON 文件映射到名为 Tweets.java 的 java 类,并且我能够绑定(bind)和检索 JSON 文件的第一部分(tweet 类)中的数据,但 Jackson ObjectMapper 无法映射 Tweets.Java 的嵌套类(用户类和实体类)。

这是我访问 JSON 绑定(bind)到的类的方法:

WeatherDatabaseCreator.java

//Read in files to be parsed.
for (int i = 0; i < twitterFiles.size(); i++) {

File twitterFile = twitterFiles.get(i);
WeatherTweetParser wtp = new WeatherTweetParser(twitterFile);
wtp.mapJavaObject();

tws = new Tweets();
tweets = tws.getTweets();

System.out.print(tweets.size());

tweetIndex = 0;

System.out.println("Parsing and inserting twitter file '" + twitterFile.getAbsolutePath() + "'...");

//Step through all the tweets in each file, using the TweetParser class.
while (true) {
tweet = tweets.get(tweetIndex);
user = tweet.new User();
entity = tweet.new Entities();

userMentions = entity.getUserMentions();
hashtags = entity.getHashtags();

if (tweet.getText() == null) {
break;
}
numParsed++;

Boolean success = wdbm.insertTweet(tweet, user);
if (success == true) {
numInserted++;
}

if (entity.getNumHashtags() > 0){

for (int j = 0; j < entity.getNumHashtags(); j++) {
wdbm.insertHashtag(tweet, hashtags.get(j));
}
}

if (entity.getNumUserMentions() > 0) {

for (int k = 0; k < entity.getNumUserMentions(); k++) {
wdbm.insertReference(tweet, userMentions.get(k));
}
}

if (numParsed % UPDATE_INTERVAL == 0) {
System.out.println(numParsed + " tweets parsed. " + numInserted + " tweets inserted into database...");
}

tweetIndex++;
}

这是 JSON 文件的一部分。该文件由一系列推文组成,其中包含一些嵌套类,包括用户信息和实体信息(主题标签、用户提及)。这里我包含了数组的两个元素:

2014-01-03-11-03.terms.json

{
"tweets": [
{
"filter_level": "medium",
"contributors": null,
"text": "U know your ice fishing at home when ur snacks are sandwiches,chips,dips,beef jerky and all the goodies instead of just a case of beer #mom",
"geo": null,
"retweeted": false,
"in_reply_to_screen_name": null,
"truncated": false,
"lang": "en",
"entities": {
"symbols": [

],
"urls": [

],
"hashtags": [
{
"text": "mom",
"indices": [
135,
139
]
}
],
"user_mentions": [

]
},
"in_reply_to_status_id_str": null,
"id": 419137025376145408,
"source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone<\/a>",
"in_reply_to_user_id_str": null,
"favorited": false,
"in_reply_to_status_id": null,
"retweet_count": 0,
"created_at": "Fri Jan 03 16:03:48 +0000 2014",
"in_reply_to_user_id": null,
"favorite_count": 0,
"id_str": "419137025376145408",
"place": null,
"user": {
"location": "",
"default_profile": false,
"profile_background_tile": true,
"statuses_count": 5411,
"lang": "en",
"profile_link_color": "17EBCF",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/408240224/1384838946",
"id": 408240224,
"following": null,
"protected": false,
"favourites_count": 4222,
"profile_text_color": "333333",
"description": "It is what it is, no more, no less. Trust in the Lord. BSU Softball #5. My whole being is happy - Psalm 16:9",
"verified": false,
"contributors_enabled": false,
"profile_sidebar_border_color": "FFFFFF",
"name": "Nicole Anne",
"profile_background_color": "C0DEED",
"created_at": "Wed Nov 09 05:03:58 +0000 2011",
"default_profile_image": false,
"followers_count": 452,
"profile_image_url_https": "https://pbs.twimg.com/profile_images/413270299925164033/mWiJBKP2_normal.jpeg",
"geo_enabled": true,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/698793822/14d9ce538d96b435ad4449d5385a3ec1.jpeg",
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/698793822/14d9ce538d96b435ad4449d5385a3ec1.jpeg",
"follow_request_sent": null,
"url": null,
"utc_offset": -32400,
"time_zone": "Alaska",
"notifications": null,
"profile_use_background_image": true,
"friends_count": 634,
"profile_sidebar_fill_color": "DDEEF6",
"screen_name": "NDupay",
"id_str": "408240224",
"profile_image_url": "http://pbs.twimg.com/profile_images/413270299925164033/mWiJBKP2_normal.jpeg",
"listed_count": 1,
"is_translator": false
},
"coordinates": null
},
{
"filter_level": "medium",
"contributors": null,
"text": "Just watched DeBlasio shovel snow for the cameras and I have to say, his form is terrible. Looks a bit inexperienced.",
"geo": null,
"retweeted": false,
"in_reply_to_screen_name": null,
"truncated": false,
"lang": "en",
"entities": {
"symbols": [

],
"urls": [

],
"hashtags": [

],
"user_mentions": [

]
},
"in_reply_to_status_id_str": null,
"id": 419137026458673152,
"source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone<\/a>",
"in_reply_to_user_id_str": null,
"favorited": false,
"in_reply_to_status_id": null,
"retweet_count": 0,
"created_at": "Fri Jan 03 16:03:48 +0000 2014",
"in_reply_to_user_id": null,
"favorite_count": 0,
"id_str": "419137026458673152",
"place": null,
"user": {
"location": "",
"default_profile": false,
"profile_background_tile": false,
"statuses_count": 2609,
"lang": "en",
"profile_link_color": "FF8000",
"id": 163686045,
"following": null,
"protected": false,
"favourites_count": 204,
"profile_text_color": "333333",
"description": "Love learning, Hockey #NYR, music and photography. My family is my whole life.",
"verified": false,
"contributors_enabled": false,
"profile_sidebar_border_color": "EEEEEE",
"name": "Steven Marques",
"profile_background_color": "ACDED6",
"created_at": "Wed Jul 07 01:26:25 +0000 2010",
"default_profile_image": false,
"followers_count": 56,
"profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000795958214/5e3ff928282ad692a36e941e5c5ff628_normal.jpeg",
"geo_enabled": false,
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme18/bg.gif",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme18/bg.gif",
"follow_request_sent": null,
"url": null,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"notifications": null,
"profile_use_background_image": true,
"friends_count": 58,
"profile_sidebar_fill_color": "F6F6F6",
"screen_name": "SMGafanha",
"id_str": "163686045",
"profile_image_url": "http://pbs.twimg.com/profile_images/378800000795958214/5e3ff928282ad692a36e941e5c5ff628_normal.jpeg",
"listed_count": 2,
"is_translator": false
},
"coordinates": null
},

这是 JSON 文件映射到的 Java 类,后面是映射 JSON 的类:

Tweets.java

public class Tweets {

private ArrayList<Tweet> tweets;

public Tweets() {
tweets = new ArrayList<Tweet>();
}

public ArrayList<Tweet> getTweets() {
return tweets;
}

public void setTweets(ArrayList<Tweet> tweets) {
this.tweets = tweets;
}

public static class Tweet {

private String text;
@JsonProperty("source")
private String postMethod;
@JsonProperty("created_at")
private String time;
@JsonProperty("id")
private String ID;

public Tweet() {

}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

public String getID() {
return ID;
}

public void setID(String iD) {
ID = iD;
}

public String getPostMethod() {
return postMethod;
}

public void setPostMethod(String postMethod) {
this.postMethod = postMethod;
}

public String getTime() {
return time;
}

public void setTime(String time) {
this.time = time;
}

public class User {

private String location;
@JsonProperty("screen_name")
private String user;
@JsonProperty("time_zone")
private String timeZone;
@JsonProperty("description")
private String accountDescription;

public User(){

}

public String getLocation() {
return location;
}

public void setLocation(String location) {
this.location = location;
}

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}

public String getTimeZone() {
return timeZone;
}

public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}

public String getAccountDescription() {
return accountDescription;
}

public void setAccountDescription(String accountDescription) {
this.accountDescription = accountDescription;
}
}
public class Entities {

@JsonProperty("user_mentions")
ArrayList<UserMention> userMentions;
@JsonProperty("hashtags")
ArrayList<Hashtag> hashtags;

public Entities() {
userMentions = new ArrayList<UserMention>();
hashtags = new ArrayList<Hashtag>();
}

public ArrayList<UserMention> getUserMentions() {
return userMentions;
}

public int getNumUserMentions() {
return userMentions.size();
}

public UserMention getUserMention(int index) {
return userMentions.get(index);
}

public void setUserMentions(ArrayList<UserMention> userMentions) {
this.userMentions = userMentions;
}

public ArrayList<Hashtag> getHashtags() {
return hashtags;
}

public int getNumHashtags() {
return hashtags.size();
}

public Hashtag getHashtag(int index) {
return hashtags.get(index);
}

public void setHashtags(ArrayList<Hashtag> hashtags) {
this.hashtags = hashtags;
}

public class UserMention {

@JsonProperty("screen_name")
private String userRef;

public UserMention() {

}

public String getUserRef() {
return userRef;
}

public void setUserRef(String userRef) {
this.userRef = userRef;
}
}
public class Hashtag {

@JsonProperty("text")
private String hashText;

public Hashtag() {

}

public String getHashText() {
return hashText;
}

public void setHashText(String hashText) {
this.hashText = hashText;
}
}
}
}


WeatherTweetParser.java

public class WeatherTweetParser {

private static File twitterFile;

public WeatherTweetParser(File twitterFile) {
WeatherTweetParser.twitterFile = twitterFile;
}

public Tweets mapJavaObject() {

Tweets ret = null;
Path jsonFile = twitterFile.toPath();
byte[] jsonData = null;

try {
jsonData = Files.readAllBytes(jsonFile);
} catch (IOException e1) {
e1.printStackTrace();
}


System.out.println("Mapping JSON to WeatherTweet Class.");

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
ret = (Tweets) mapper.readValue(jsonData, Tweets.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println("Finished Mapping of JSON File.");

return ret;
}

public static void main(String[] args) {

new WeatherTweetParser(twitterFile);
}

这是控制台输出:

//Right before event passing the data to the method to enter into the db, 
//and right after each tweet is grabbed in WeatherDatabaseCreator.java

username: null
location: null
time zone: null
account description: null

//Right Before inserting into database.

username: null
time/date: Jan 03 2014 11:03:48
text: RT @_PumpsAndJays: It's winter, right?
location: null
. . .
timezone = null

TL:DR:所以看起来我用来将 JSON 文件映射到的类没有存储用户和实体(我已经研究了后者,但它也不起作用,即所有空值),但它存储推文信息(即时间、文本等)。问题是:为什么 WeatherTweetParser.java 映射的是 java 类的一部分而不是全部?

最佳答案

再一次,就像推文的情况一样,您没有将数据加载到“用户”对象。而不是:

user = tweet.new User();

您应该使用:

user = tweet.getUser();

您的 Tweet 类中还缺少以下内容:

@JsonProperty("user")
private User user;
public User getUser() { return user; }

我不知道您是如何生成 Tweets.java 文件的,但它似乎并不完整。考虑使用http://www.jsonschema2pojo.org/重新生成它。

关于Java:Jackson 数据绑定(bind)无法从 JSON 文件映射整个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23837253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com