Gson - Json से एक टाइप किए गए ArrayList <T> में कनवर्ट करें


211

Gson लाइब्रेरी का उपयोग करते हुए, मैं JSON स्ट्रिंग को ArrayListकस्टम वर्ग में कैसे परिवर्तित करूं JsonLog? मूल रूप से, JsonLogमेरे एंड्रॉइड ऐप द्वारा किए गए विभिन्न प्रकार के लॉग द्वारा लागू किया गया इंटरफ़ेस है - एसएमएस लॉग, कॉल लॉग, डेटा लॉग - और यह ArrayListउन सभी का एक संग्रह है। मुझे लाइन 6 में एक त्रुटि मिलती रहती है।

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। मैं क्या करूं?


कृपया एक अन्य दृष्टिकोण के लिए stackoverflow.com/questions/44589381/… को देखें
पंकज जायसवाल

जवाबों:


515

आप एक कस्टम ऑब्जेक्ट में json स्ट्रिंग लोड करने के लिए TypeToken का उपयोग कर सकते हैं ।

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
इस दृष्टिकोण की कोशिश की और मुझे यह कहते हुए एक संकलित त्रुटि मिली कि TypeToken () ने केवल एक्सेस की रक्षा की है
जोनाथन

1
@ जोनी मेरे पास एक ही मुद्दा है। कोई उपाय?
ज़ाप्नोलोगिका

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- इस विधि का उपयोग करके अपने लौटे सरणी सूची को json प्रारूप में बदल देगा

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

2- इसे साझा प्रीफ्रेन्यूल्स में सेव करें

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

3- किसी भी समय इसे पुनः प्राप्त करने के लिए उस जैसी साझा प्राथमिकताओं से JsonString प्राप्त करें

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());

यदि आप ऑब्जेक्ट्स के ArrayList को पार्स करना चाहते हैं तो यह समाधान भी संभव है, Gson Library का उपयोग करके यह आपकी मदद करता है ।


यह सही समाधान है, लेकिन अनिवार्य रूप से तीन साल पुराने उत्तर के रूप में एक बहुत ही अस्वाभाविक जानकारी के साथ जवाब है - मैं यहाँ साझा करने के बारे में जानने के लिए नहीं आया था
Xerus

8

यदि आप Arrays का उपयोग करना चाहते हैं, तो यह बहुत आसान है।

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

किसी ने JSON स्ट्रिंग को सूची में बदलने का यह सरल तरीका क्यों नहीं लिखा ?

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

1

मैं गन्स के बारे में निश्चित नहीं हूं, लेकिन यह है कि आप इसे जॉन के साथ कैसे करते हैं। आशा है कि गन्स का उपयोग करने का समान तरीका होना चाहिए

{"खिलाड़ी": ["खिलाड़ी 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"}]"

फिर आप इसे Gray जैसे के माध्यम से ArrayList में गुप्त कर सकते हैं

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

आपका HotelInfo वर्ग इस तरह का होना चाहिए।

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
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.