मैं JSONB के साथ एक JSON ऐरे को deserialize करने की कोशिश कर रहा हूँ।

JSON

[
  {
    "id": "1",
    "animal": "dog",
    "age": "3"
  },
  {
    "id": "2",
    "animal": "cat",
    "age": "5"
  }
]

नियंत्रक

Jsonb jsonb = JsonbBuilder.create();    
Animal animal;
AnimalsList animalsList;

public AnimalsList getAnimals() {
    try {
        animalsList = jsonb.fromJson("[{\"id\":\"1\",\"animal\":\"dog\",\"age\":\"3\"},{\"id\":\"2\",\"animal\":\"cat\",\"age\":\"5\"}]", AnimalsList.class);
    } catch (JSONException ex) {
        Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
    }
    return animalsList;
}

जानवरों की सूची

public class AnimalsList implements Serializable{

    private List<Animal> list;

    public AnimalsList() {
    }

    public AnimalsList(List<Animal> list) {
        this.list = list;
    }

    // getter & setter
}

जानवर

public class Animal implements Serializable{

    private int id;
    private String animal;
    private int age;

    public Animal() {
    }

    public Animal(int id, String animal, int age) {
        this.id = id;
        this.animal = animal;
        this.age = age;
    }

    // getter & setter
}

लेकिन मुझे निम्न त्रुटि मिलती है:

javax.json.bind.JsonbException: Can't deserialize JSON array into: class com.model.AnimalsList
3
Evgenij Reznik 12 अगस्त 2019, 17:02
1
आपके जेसन में एक सरणी प्रकार है, आप इसे किसी एक ऑब्जेक्ट (एक AnimalsList ऑब्जेक्ट) में deserialize नहीं कर सकते हैं। आप अपने json को सीधे एक List<Animal> में डिसेरिएलाइज़ करने का प्रयास कर सकते हैं।
 – 
Arnaud
12 अगस्त 2019, 17:05
@अरनौद: इस तरह List<Animal> animals = jsonb.fromJson("[{...}]", List.class)?
 – 
Evgenij Reznik
12 अगस्त 2019, 17:15
2
शायद List.class के बजाय new ArrayList<Animal>(){}.getClass().getGenericSuperclass() के साथ, यहां देखें: javaee.github.io/jsonb-spec/users-guide.html
 – 
Arnaud
12 अगस्त 2019, 17:18

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि Arnaud की टिप्पणी में लिखा गया है, यह गाइड एक समाधान दिखाता है:

List<Dog> dogs = new ArrayList<>();
dogs.add(falco);
dogs.add(cassidy);

// Create Jsonb and serialize
Jsonb jsonb = JsonbBuilder.create();
String result = jsonb.toJson(dogs);

// Deserialize back
dogs = jsonb.fromJson(result, new ArrayList<Dog>(){}.getClass().getGenericSuperclass());
1
Stefan Großmann 3 मार्च 2021, 22:14
कोड काम करता है, लेकिन जेनेरिक विधि द्वारा लपेटे जाने पर नहीं। सामान्य विधि फेंकता है: WARNING: Generic bound not found for type T declared in public static java.util.List fromJsonArray(jakarta.json.bind.Jsonb,java.lang.String).
 – 
ARX
25 फरवरी 2021, 18:59
इसके बाद: java.lang.ClassCastException: class java.util.HashMap cannot be cast to class my.package.MyType (java.util.HashMap is in module java.base of loader 'bootstrap'; my.package.MyType is in unnamed module of loader 'app')
 – 
ARX
25 फरवरी 2021, 19:00
@ARX: सामान्य विधि वाला अनुभाग पोस्ट से हटा दिया गया है
 – 
Stefan Großmann
3 मार्च 2021, 22:15

यदि आप केवल JSON-B का उपयोग करने के लिए प्रतिबंधित नहीं हैं, तो आप इसे ObjectMapper के साथ TypeReferenceing द्वारा कर सकते हैं।

private ObjectMapper objectMapper = new ObjectMapper();
List<Animal> animals = objectMapper.readValue(json , new TypeReference<List<Animal>>(){});
0
Sanket Patel 15 नवम्बर 2019, 11:55