গসন - জসন থেকে একটি টাইপযুক্ত অ্যারেলিস্টে রূপান্তর করুন <টি>


211

গসন লাইব্রেরি ব্যবহার করে, আমি কীভাবে কোনও জেএসএন স্ট্রিংকে ArrayListএকটি কাস্টম শ্রেণীর রূপান্তর করব JsonLog? মূলত, JsonLogআমার অ্যান্ড্রয়েড অ্যাপ দ্বারা তৈরি বিভিন্ন ধরণের লগ দ্বারা প্রয়োগ করা একটি ইন্টারফেস - এসএমএস লগস, কল লগস, ডেটা লগস - এবং এটি ArrayListতাদের সকলের একটি সংগ্রহ। আমি লাইন 6 এ ত্রুটি পেতে থাকি keep

public static void log(File destination, JsonLog log) {
    Collection<JsonLog> logs = null;
    if (destination.exists()) {
        Gson gson = new Gson();
        BufferedReader br = new BufferedReader(new FileReader(destination));
        logs = gson.fromJson(br, ArrayList<JsonLog>.class); // line 6
        // logs.add(log);
        // serialize "logs" again
    }
}

দেখে মনে হচ্ছে সংকলক বুঝতে পারে না আমি টাইপ করা হচ্ছে ArrayList। আমি কি করব?


উত্তর:


515

আপনি কাস্টম অবজেক্টে জসন স্ট্রিং লোড করতে টাইপটোকেন ব্যবহার করতে পারেন ।

logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());

ডকুমেন্টেশন:

জেনেরিক টাইপ টি প্রতিনিধিত্ব করে ।

জাভা এখনও জেনেরিক ধরণের উপস্থাপনের জন্য কোনও উপায় সরবরাহ করে না, তাই এই শ্রেণিটি করে। ক্লায়েন্টদের এই শ্রেণীর একটি সাবক্লাস তৈরি করতে বাধ্য করে যা রানটাইমে এমনকি টাইপ তথ্য পুনরুদ্ধার করতে সক্ষম করে।

উদাহরণস্বরূপ, এর জন্য একটি টাইপ আক্ষরিক List<String>তৈরি করতে, আপনি খালি বেনামে অভ্যন্তর শ্রেণি তৈরি করতে পারেন:

TypeToken<List<String>> list = new TypeToken<List<String>>() {};

এই সিনট্যাক্সটি টাইপ লিটারাল তৈরি করতে ব্যবহার করা যাবে না যেখানে ওয়াইল্ডকার্ড প্যারামিটার রয়েছে, যেমন Class<?>বা List<? extends CharSequence>

Kotlin:

আপনার যদি কোটলিনে এটি করার দরকার হয় তবে আপনি এটি এইভাবে করতে পারেন:

val myType = object : TypeToken<List<JsonLong>>() {}.type
val logs = gson.fromJson<List<JsonLong>>(br, myType)

অথবা আপনি বিভিন্ন বিকল্পের জন্য এই উত্তর দেখতে পারেন ।


3
এই পদ্ধতির চেষ্টা করেছিলাম এবং টাইপটোকেন () কেবল অ্যাক্সেস রক্ষা করেছে
জোনাথন

1
@ জোনির আমারও একই সমস্যা আছে। কোন সমাধান?
Zapnologica

15
যদি আপনি সুরক্ষিত অ্যাক্সেস ত্রুটিটি পেয়ে থাকেন তবে আপনি এর { }আগে বাদ দিয়েছিলেন.getType()
Zapnologica

@ অ্যালেক্স কি প্রথমে অ্যারে ডিজিটালাইজ করে তারপরে অ্যারে তালিকায় রূপান্তরিত হয় বা এটি সরাসরি তালিকাতে ডিজিটালাইজ করে?
আদনান আলী

পুরো গরু! আমি এটা ঠিক আছে ... ভাল ... কখনও না। ধন্যবাদ.
জন ওয়ার্ড

26

আপনার JSON নমুনাটি হ'ল:

{
    "status": "ok",
    "comment": "",
    "result": {
    "id": 276,
    "firstName": "mohamed",
    "lastName": "hussien",
    "players": [
            "player 1",
            "player 2",
            "player 3",
            "player 4",
            "player 5"
    ]
}

সুতরাং আপনি যদি নিজের SharedPrefrences এ মডিউলগুলির অ্যারেলিস্ট সংরক্ষণ করতে চান তবে:

1- এই পদ্ধতিটি ব্যবহার করে আপনার ফিরে আসা অ্যারেলিস্টটিকে জসন ফর্ম্যাটের জন্য রূপান্তর করবে

public static String toJson(Object jsonObject) {
    return new Gson().toJson(jsonObject);
}

2- এটি ভাগ করা উপস্থানে সংরক্ষণ করুন

PreferencesUtils.getInstance(context).setString("players", toJson((.....ArrayList you want to convert.....)));

3- যে কোনও সময় এটি পুনরুদ্ধার করতে জসনস্ট্রিংকে এর মতো ভাগ করা পছন্দগুলি থেকে পান

String playersString= PreferencesUtils.getInstance(this).getString("players");

4- এটিকে আবার অ্যারে তালিকায় রূপান্তর করুন

public static Object fromJson(String jsonString, Type type) {
    return new Gson().fromJson(jsonString, type);
}

ArrayList<String> playersList= (ArrayList<String>) fromJson(playersString,
                    new TypeToken<ArrayList<String>>() {
                    }.getType());

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


এই সঠিক সমাধান, কিন্তু তিন বছর হিসাবে মূলত একই অপ্রয়োজনীয় তথ্য অনেক সঙ্গে পুরোনো উত্তর - আমি এখানে sharedPreferences বিষয়ে জানার জন্য এসেছিল
Xerus

8

আপনি যদি অ্যারে ব্যবহার করতে চান তবে এটি বেশ সহজ।

logs = gson.fromJson(br, JsonLog[].class); // line 6

JsonLogঅ্যারে হিসাবে সরবরাহ করুনJsonLog[].class


8

Kotlin

data class Player(val name : String, val surname: String)

val json = [
  {
    "name": "name 1",
    "surname": "surname 1"
  },
  {
    "name": "name 2",
    "surname": "surname 2"
  },
  {
    "name": "name 3",
    "surname": "surname 3"
  }
]

val typeToken = object : TypeToken<List<Player>>() {}.type
val playerArray = Gson().fromJson<List<Player>>(json, typeToken)

অথবা

val playerArray = Gson().fromJson(json, Array<Player>::class.java)

5

কেন জাসন স্ট্রিংকে তালিকায় রূপান্তর করার সহজ উপায়টি কেউ লেখেনি ?

List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));

1

আমি গসন সম্পর্কে নিশ্চিত নই তবে আপনি জোন এর সাথে এটি কীভাবে করেন with নমুনা আশা করি গসন ব্যবহারের অনুরূপ উপায় থাকতে হবে

{"খেলোয়াড়": ["প্লেয়ার 1", "প্লেয়ার 2", "প্লেয়ার 3", "প্লেয়ার 4", "প্লেয়ার 5"]}

===============================================

import java.io.FileReader;
import java.util.List;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class JosnFileDemo {

    public static void main(String[] args) throws Exception
    {
        String jsonfile ="fileloaction/fileName.json";


                FileReader reader = null;
                JSONObject jsb = null;
                try {
                    reader = new FileReader(jsonfile);
                    JSONParser jsonParser = new JSONParser();
                     jsb = (JSONObject) jsonParser.parse(reader);
                } catch (Exception e) {
                    throw new Exception(e);
                } finally {
                    if (reader != null)
                        reader.close();
                }
                List<String> Players=(List<String>) jsb.get("Players");
                for (String player : Players) {
                    System.out.println(player);
                }           
    }
}

@ সাগর জালা: আপনি কী উদাহরণ আশা করছেন ..?
অরুন কোঙ্গারা

0

আপনার মতো স্ট্রিং রয়েছে

"[{"id":2550,"cityName":"Langkawi","hotelName":"favehotel Cenang Beach - Langkawi","hotelId":"H1266070"},
{"id":2551,"cityName":"Kuala Lumpur","hotelName":"Metro Hotel Bukit Bintang","hotelId":"H835758"}]"

তারপর আপনি এটি গোপন করতে ArrayList মাধ্যমে Gson মত

var hotels = Gson().fromJson(historyItem.hotels, Array<HotelInfo>::class.java).toList()

আপনার হোটেলআইনফো ক্লাসটি এটি পছন্দ করে।

import com.squareup.moshi.Json

data class HotelInfo(

    @Json(name="cityName")
    val cityName: String? = null,

    @Json(name="id")
    val id: Int? = null,

    @Json(name="hotelId")
    val hotelId: String? = null,

    @Json(name="hotelName")
    val hotelName: String? = null
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.