故事發生在二戰期間的英國。12歲的約瑟夫·帕爾梅是個問題小孩,脾氣暴戾。五歲時,母親離開了他,他一直跟著父親生活,直到二戰爆發,父親應徵入伍,奔赴戰場。約瑟夫的祖母無法管教他,於是把約瑟夫託付給自己以前做護士時曾照顧過一位病人——法雷利夫人。一開始,雙方的相處並不愉悅。法雷利夫人也是個暴脾氣,她接納約瑟夫完全是出於承諾而非喜愛。約瑟夫則覺得自己被所有人拋棄,常常用憤怒掩飾自己的悲傷,叛逆地應對法雷利夫人下達的任何命令。
法雷利夫人有一座動物園,裡面最寶貴的是一隻名叫“阿多尼斯”銀背大猩猩。她安排約瑟夫每日去動物園幹活,主要的工作是用兩匹小馬把駱駝的糞便運送到菜地,以換取一些蔬菜餵養動物園裡的大猩猩。約瑟夫發現每次空襲警報響起,所有人都躲進防空洞裡時,法雷利夫人都會去到她的動物園,拿著來福槍瞄準心愛的大猩猩阿多尼斯。事後得知,原來法雷利夫人怕空襲會炸開籠子,大猩猩會出來傷人,所以決定在悲劇發生之前先將大猩猩射殺。
法雷利夫人還將約瑟夫送去了學校。學校只有一位老師和九個學生。校長格立斯先生曾在一戰時擔任軍官,現在他像管理軍營一樣管理著這所學校。每個月他都會給學生測試,並邀請家長來參觀,仿佛閱兵儀式一般。校長有一根手杖,無論是行為還是測驗表現不好的學生,都會遭到嚴厲的杖刑。約瑟夫患有閱讀障礙症,每當他開始閱讀的時候,紙上的文字就飛舞起來。約瑟夫曾向之前的老師、校長和祖母訴說了他在閱讀上困擾,大家卻不相信他,認為他只是偷懶和說謊。他因此受了不少責罰。於是,他從此不再向他人打開心扉,而是用憤怒和譏諷去掩蓋自己。
約瑟夫認識了同在動物園工作的女孩西德,她的父母在一次空襲中為了保護她而遇難了,而西德卻十分堅強、樂觀。在她的耐心幫助下,約瑟夫逐漸走出自己的帶刺的保護殼。為了應對月末的考試,西德幫助約瑟夫背誦了全部課文,企圖幫他蒙混過關。不料,卻被校長當眾拆穿。幸好,法雷利夫人及時趕到,她向校長說明瞭約瑟夫的閱讀障礙症,校長並不相信,於是她便帶著約瑟夫永遠地離開了學校。
約瑟夫每日餵食大猩猩,與大猩猩的感情越來越好。有一天,學校惡霸伯特和吉米翻牆偷偷溜進動物園,在猩猩籠子邊毆打約瑟夫。大猩猩從籠子裡伸出手一把抓住了伯特,並試圖將他拖進籠子裡。儘管被打得鼻青臉腫,然而心地善良的約瑟夫還是救下了伯特。可是伯特卻並不領情,轉頭就告訴了爸爸。他的爸爸投訴了動物園,政府責令法雷利夫人兩周內將大猩猩轉移到其他動物園,否則就要派人將它射殺。約瑟夫和法雷利夫人決定拼上性命也要保護大猩猩。
一天,空襲轟炸了這座城市。這天剛好是法雷利夫人女兒的忌日,她喝得酩酊大醉。約瑟夫趁著房子被炸塌之前把法雷利夫人安置在防空洞裡,然後孤身前往動物園,替法雷利夫人完成她的任務——用槍瞄準大猩猩。炸彈落到了動物園,炸毀了水族館,約瑟夫也被炸暈了過去。當他醒來時,他發現自己的左腿被石板壓住不能動彈。
大猩猩流著血出現了,它的籠子果真被炸開了,但它卻沒有趁機逃跑,而是不離不棄地守護著約瑟夫。大猩猩移開約瑟夫腿上的石板,還保護他免遭狼的攻擊。後來,一隊士兵來到動物園,出於對大猩猩的恐懼,他們開槍射殺了它。及時趕到的法雷利夫人和一直大吼大叫的約瑟夫都沒能阻止他們。約瑟夫終於忍不住撲進法雷利夫人的懷裡放聲痛哭,不只是為死去的大猩猩,還為了他的離去的母親和戰死的父親。最終,他們倆都哭了起來,盡情地釋放著壓抑已久的情感,他們終於在彼此身上找到了久違的溫暖和慰藉。