본관은 광산(光山). 자는 원부(元敷). 서울 출신. 김재홍(金在弘)의 아들이고, 김재청(金在淸)의 양자이다.
1878년 정시문과에 병과로 급제하였다. 1884년 안악군수(安岳郡守)로 있을 때 민요(民擾)가 있자, 황해감사 윤우선(尹宇善)으로부터 문책을 당하였다.
갑신정변 신내각의 병조참의였으며, 1885년부터 1891년까지 한성부좌윤·이조참의·공조참판·대사성·형조참판·대사헌·형조판서·예조판서 등을 지냈다. 1893년 동학교도의 보은집회(報恩集會)가 있자 광주부유수(廣州府留守)에서 전라도관찰사로 임명되었다.
1894년 2월 고부민란(古阜民亂)이 일어나자 군수 조병갑(趙秉甲)을 체포하는 한편, 고부에 속리를 보내 사건의 주동자인 전봉준(全琫準)을 회유 내지 붙잡도록 하였으나 실패하였다.
그 뒤 동학농민군이 봉기하여 부안군아(扶安郡衙)를 습격하는 등 민란의 규모가 확대되자, 영장(營將) 이광양(李光陽) 등에 명하여 동학농민군을 토벌하게 하였다. 그러나 황토현전투(黃土峴戰鬪)에서 패퇴함으로써 문책, 파면되고 거제도에 유배되었다.