जावा में GSON या किसी अन्य JSON लाइब्रेरी का उपयोग करके सूची को डिसेर्बलाइज़ कैसे करें?


121

मैं List<Video>GAE पर अपने सर्वलेट में एक अनुक्रमित कर सकता हूं, लेकिन मैं इसे डिसेर्बलाइज नहीं कर सकता। मैं क्या गलत कर रहा हूं?

यह GAE में मेरा क्लास वीडियो है, जिसे क्रमबद्ध किया गया है:

package legiontube;

import java.util.Date;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Video {

    @PrimaryKey
    private String id;

    @Persistent
    private String titulo;

    @Persistent
    private String descricao;

    @Persistent
    private Date date;

    public Video(){};

 public Video(String id, String titulo, String descricao, Date date) {
  //super();
  this.id = id;
  this.titulo = titulo;
  this.descricao = descricao;
  this.date = date;
 }

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getTitulo() {
  return titulo;
 }

 public void setTitulo(String titulo) {
  this.titulo = titulo;
 }

 public String getDescricao() {
  return descricao;
 }

 public void setDescricao(String descricao) {
  this.descricao = descricao;
 }

 public Date getDate() {
  return date;
 }

 public void setDate(Date date) {
  this.date = date;
 }

}

मेरे अन्य एप्लिकेशन में यह मेरा क्लास वीडियो है, जहां मैं डीरेल करने की कोशिश करता हूं:

package classes;

import java.util.Date;

public class Video {
 private String id;
 private String titulo;
 private String descricao;
 private Date date;

 public Video(String id, String titulo, String descricao, Date date) {
  //super();
  this.id = id;
  this.titulo = titulo;
  this.descricao = descricao;
  this.date = date;
 }

 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getTitulo() {
  return titulo;
 }
 public void setTitulo(String titulo) {
  this.titulo = titulo;
 }
 public String getDescricao() {
  return descricao;
 }
 public void setDescricao(String descricao) {
  this.descricao = descricao;
 }
 public Date getDate() {
  return date;
 }
 public void setDate(Date date) {
  this.date = date;
 }

}

FYI करें, Gson 1.7 के रूप में, नो-आर्ग कंस्ट्रक्टर की आवश्यकता नहीं है। समूह देखें। Google समूह / PDF-gson/browse_thread/thread/… हैप्पी कोडिंग।
जोएल

जवाबों:


328

Gson के साथ, आपको बस कुछ करने की आवश्यकता होगी:

List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());

आपको उस Videoवर्ग पर एक नो-आर्ग कंस्ट्रक्टर प्रदान करने की आवश्यकता हो सकती है, जिस पर आप वांछित हैं।


यार, तुम अद्भुत हो, बहुत बहुत धन्यवाद, यह काम करता है। मेरी गलती से कोई आर्गन के साथ एक निर्माता नहीं बना था। आपको बहुत - बहुत धन्यवाद!
वाल्टर सिल्वा

4
नए टाइपटाउन में {} क्या है <सूची <वीडियो >> () {}। GetType ()? यह कैसे कानूनी जावा वाक्यविन्यास है?
मैक्सिम वीक्स्लर

8
@ मैक्सिम: यह एक अनाम उपवर्ग बना रहा है TypeToken<List<Video>>... यह एक ऐसी चाल है जिसके परिणामस्वरूप परिणामी प्रकार का प्रतिनिधित्व करने की अनुमति मिलती है List<Video>, क्योंकि पूरी तरह से निर्दिष्ट सामान्य प्रकार के उपवर्गों में सामान्य प्रकार की जानकारी बरकरार रहती है।
कॉलिनडी

1
Gson के 2.1 संस्करण में अब एक डिफॉल्ट एक्सेस कंस्ट्रक्टर है ... इसलिए हम ऊपर दिए गए कोड का उपयोग नहीं कर सकते ... इसके बजाय अब TypeToken वर्ग में निम्न विधि है: सार्वजनिक स्थैतिक TypeToken <?> (टाइप प्रकार) {रिटर्न न्यू TypeToken (प्रकार); } लेकिन इस मामले में ... हम इसे सही प्रकार कैसे प्रदान कर सकते हैं ???
पाब्लो

1
@ पाब्लो: यह मुझे ऐसा लगता है जैसे कि गन्स 2.1 में TypeTokenअभी भी कोई arg कंस्ट्रक्टर नहीं है protected, इसलिए ऊपर वाले को अभी भी काम करना चाहिए।
कोलिनड

108

एक और तरीका है एक सरणी को एक प्रकार के रूप में उपयोग करना, जैसे:

Video[] videoArray = gson.fromJson(json, Video[].class);

इस तरह आप टाइप ऑब्जेक्ट के साथ सभी परेशानी से बचते हैं, और अगर आपको वास्तव में एक सूची की आवश्यकता है, तो आप हमेशा सरणी को एक सूची में बदल सकते हैं, जैसे:

List<Video> videoList = Arrays.asList(videoArray);

IMHO यह बहुत अधिक पठनीय है।


में Kotlin इस दिखता है यह पसंद:

Gson().fromJson(jsonString, Array<Video>::class.java)

इस सरणी को सूची में बदलने के लिए, बस .toList()विधि का उपयोग करें


1
स्वीकृत उत्तर अच्छा है, लेकिन मैं इसे पसंद करता हूं क्योंकि मैं वास्तव में चाहता था कि सामान की एक सूची है और सरणी "सामान की सूची" के रूप में सेवा करने के लिए पर्याप्त है
smac89

10

इस एक-लाइनर का प्रयास करें

List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));

चेतावनी: की सूची videos, द्वारा लौटाए गए Arrays.asListअपरिवर्तनीय है - आप नए मूल्यों को नहीं डाल सकते।


संदर्भ:

  1. विधि Arrays # asList
  2. कंस्ट्रक्टर गॉन
  3. विधि Gson # fromJson (स्रोत jsonप्रकार का हो सकता है JsonElement, Readerया String)
  4. इंटरफ़ेस सूची
  5. जेएलएस - एरेस
  6. जेएलएस - जेनेरिक इंटरफेस

2

@DevNG द्वारा प्रदान किए गए उत्तर का उपयोग करके सावधान रहें। Arrays.asList () ArrayList का आंतरिक कार्यान्वयन देता है जो कुछ उपयोगी विधियों जैसे कि ऐड (), डिलीट (), आदि को लागू नहीं करता है, यदि आप उन्हें UnsupportedOperationException कहते हैं, तो उन्हें फेंक दिया जाएगा। वास्तविक ArrayList उदाहरण प्राप्त करने के लिए आपको कुछ इस तरह लिखना होगा:

List<Video> = new ArrayList<>(Arrays.asList(videoArray));

वाट? Arrays.asList एक सूची इंटरफ़ेस देता है, जो ऐड () और रिमूव () भी प्रदान करता है!
एनरिचमैन

2
@Enrichman: Arrays.asList () निर्दिष्ट सरणी द्वारा समर्थित निश्चित आकार की सूची देता है। यह ArrayList कार्यान्वयन एक क्लास AbstractList का विस्तार करता है और बेस क्लास से मेथड रिमूवल (int index) को ओवरराइड नहीं करता है। और यदि आप AbstractList.remove (इंट इंडेक्स) के स्रोत कोड को देखते हैं, तो आप इसे हमेशा UnsupportedOperationException फेंकते हुए देखेंगे। वही ऐड () विधि के लिए है।
बोगदान कोर्नेव

1
Wo, यह बहुत बदसूरत है, मुझे नहीं पता था कि। इस पर ध्यान दिलाने के लिए धन्यवाद। :)
एनरिकमैन 27'16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.