জিএসওএন বা জাভাতে অন্য কোনও জেএসওএন লাইব্রেরি ব্যবহার করে কীভাবে একটি তালিকা deserialize করবেন?


121

আমি List<Video>জিএইএতে আমার সার্লেলে একটি সিরিয়ালাইজ করতে পারি , তবে আমি এটির ডিসরিয়ালাইজ করতে পারি না। আমি কি ভুল করছি?

এটি জিএইতে আমার ক্লাস ভিডিও, যা সিরিয়ালযুক্ত:

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;
 }

}

এফওয়াইআই, গসন ১.7 হিসাবে, নো-আরগস কনস্ট্রাক্টরের আর প্রয়োজন নেই। গোপনীয় কোডিংগুলি দেখুন google.google.com/group/google-gson/browse_thread/thread/… শুভ কোডিং।
জোয়েল

উত্তর:


328

গসনের সাথে আপনার ঠিক এমন কিছু করা দরকার:

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

আপনি যে Videoশ্রেণীর ডিেসরিয়াল করছেন সেটিতে আপনাকে কোনও নো-আরগ কনস্ট্রাক্টর সরবরাহ করতে হবে।


ডুড, আপনি আশ্চর্যজনক, আপনাকে অনেক ধন্যবাদ, এটি কাজ করে। আমার ভুলটি কোনও আরগস সহ কোনও কনস্ট্রাক্টর তৈরি করা হয়নি। তোমাকে অনেক ধন্যবাদ!
ভালটার সিলভা

4
নতুন টাইপটোকেন <তালিকা <ভিডিও>> () {}। গেটটাইপ ()? সারণিতে {} কী? এটি কীভাবে জাভা সিনট্যাক্স?
ম্যাক্সিম ভেক্সলার

8
@ ম্যাক্সিম: এটি একটি বেনামহীন সাবক্লাস তৈরি করছে TypeToken<List<Video>>... এটি এমন কৌশল যা ফলস্বরূপ ধরণের প্রতিনিধিত্ব করতে দেয় List<Video>, কারণ সম্পূর্ণ নির্দিষ্ট জেনেরিক ধরণের সাবক্লাসগুলি জেনেরিক ধরণের তথ্য ধরে রাখে।
কলিনড

1
গসনের ২.১ সংস্করণে এখন একটি ডিফল্ট অ্যাক্সেস কনস্ট্রাক্টর রয়েছে ... সুতরাং আমরা উপরের কোডটি ব্যবহার করতে পারি না ... পরিবর্তে এখন টাইপটোকেন শ্রেণিতে নিম্নলিখিত পদ্ধতি রয়েছে: পাবলিক স্ট্যাটিক টাইপটোকেন <?> পান (টাইপ টাইপ) {নতুন ফিরে আসুন TypeToken (টাইপ); } তবে এই ক্ষেত্রে ... আমরা কীভাবে এটি সঠিক ধরণের সরবরাহ করতে পারি ???
পাবলো

1
@ পাবলো: এটি আমার কাছে মনে হচ্ছে নো- আরগ নির্মাতা TypeTokenএখনও protectedজিএসন ২.১ এ রয়েছে, সুতরাং উপরেরটি এখনও কাজ করা উচিত।
কলিনড

108

আরেকটি উপায় হ'ল একটি অ্যারেটিকে ধরণ হিসাবে ব্যবহার করা, যেমন:

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

আপনি টাইপ অবজেক্টের সাথে সমস্ত ঝামেলা এড়ান এবং আপনার যদি সত্যিই কোনও তালিকার প্রয়োজন হয় তবে আপনি সর্বদা অ্যারেটিকে একটি তালিকায় রূপান্তর করতে পারেন, যেমন:

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

আইএমএইচও এটি আরও পাঠযোগ্য।


ইন Kotlin এই সৌন্দর্য এটি পছন্দ:

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

এই অ্যারেটিকে তালিকায় রূপান্তর করতে, কেবল .toList()পদ্ধতিটি ব্যবহার করুন


1
গৃহীত উত্তরটি ভাল, তবে আমি এটিকে পছন্দ করি যেহেতু আমি যা চেয়েছিলাম তা
স্টাফের

10

এই ওয়ান-লাইনারটি ব্যবহার করে দেখুন

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

সতর্কতা: তালিকা videos ফেরত দেওয়াArrays.asList অপরিবর্তনীয় - আপনি নতুন মান সন্নিবেশ করতে পারবেন না।


রেফারেন্স:

  1. পদ্ধতি অ্যারে # asList
  2. নির্মাতা জিসন
  3. জেসন থেকে পদ্ধতি জিসন # (উত্সটি jsonপ্রকারের হতে পারে JsonElement,Reader অথবা String)
  4. ইন্টারফেস তালিকা
  5. জেএলএস - অ্যারে
  6. জেএলএস - জেনেরিক ইন্টারফেস

2

@ ডেভএনজি দ্বারা প্রদত্ত উত্তরটি ব্যবহার করে সাবধান হন। অ্যারেএস.এললিস্ট () অ্যারেলিস্টের অভ্যন্তরীণ বাস্তবায়ন ফিরিয়ে দেয় যা কিছু কার্যকর পদ্ধতি যেমন অ্যাড (), মুছুন () ইত্যাদি প্রয়োগ করে না, যদি আপনি তাদেরকে অসমর্থিত অপারেটিং এক্সেকশন বলে থাকেন তবে নিক্ষেপ করা হবে। আসল অ্যারেলিস্ট উদাহরণটি পেতে আপনাকে এই জাতীয় কিছু লিখতে হবে:

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

ওয়াত? অ্যারে.এএসলিস্ট একটি তালিকা ইন্টারফেস প্রদান করে, যা অ্যাড () এবং অপসারণ ()ও সরবরাহ করে!
সমৃদ্ধশালী

2
@ এনরিচম্যান: অ্যারে.এএসলিস্ট () নির্দিষ্ট অ্যারে দ্বারা ব্যাক করা একটি নির্দিষ্ট আকারের তালিকা দেয়। এই অ্যারেলিস্ট বাস্তবায়নটি একটি শ্রেণীর অ্যাবস্ট্রাকলিস্টকে প্রসারিত করে এবং বেস ক্লাস থেকে পদ্ধতিটি মুছে ফেলা (ইন্ট ইনডেক্স) ওভাররাইড করে না। এবং যদি আপনি AbstractList.remove (int সূচি) এর উত্স কোডটি দেখেন তবে আপনি দেখতে পাবেন যে এটি সর্বদা অসমর্থিত অপারেশন এক্সেক্সশনটি ছুঁড়ে ফেলেছে। অ্যাড () পদ্ধতির জন্য একই।
বোগদান কোর্নেভ

1
ওহ, এটা বেশ কুৎসিত, আমি এটি জানতাম না। এটা ইশারা জন্য ধন্যবাদ। :)
সমৃদ্ধশালী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.