কীভাবে জ্যাকসনকে অবজেক্টগুলির অ্যারে ডিজাইরিয়াল করতে ব্যবহার করবেন


779

জ্যাকসন তথ্য বাঁধাই ডকুমেন্টেশন ইঙ্গিত করে যে জ্যাকসন সমর্থন "সমস্ত সমর্থিত ধরনের অ্যারেগুলির" deserialising কিন্তু আমি এই জন্য সঠিক বাক্য গঠন জিনিসটা করতে পারবে না।

একটি একক বস্তুর জন্য আমি এটি করব:

//json input
{
    "id" : "junk",
    "stuff" : "things"
}

//Java
MyClass instance = objectMapper.readValue(json, MyClass.class);

এখন একটি অ্যারের জন্য আমি এটি করতে চাই:

//json input
[{
    "id" : "junk",
    "stuff" : "things"
},
{
    "id" : "spam",
    "stuff" : "eggs"
}]

//Java
List<MyClass> entries = ?

কেউ কি জানেন কোন ম্যাজিক মিসিং কমান্ড আছে কিনা? তা না হলে সমাধান কী?


2
আমি JSON এর সাথে ডিল করার জন্য গুগলের GSON লাইব্রেরি পছন্দ করি। আপনি যদি এখনও এটি চেষ্টা না করে থাকেন তবে এটি পরীক্ষা করে দেখার মতো ... এটির সাথে কাজ করা খুব সহজ এবং স্বজ্ঞাত।
জেসি ওয়েব

11
এফডব্লিউআইডাব্লুআইডাব্লু জিসনের সাথে এই নির্দিষ্ট সমস্যার সম্ভাব্য সমাধানগুলি জ্যাকসনের ডেটা বাইন্ডিং এপিআইয়ের সাথে যা সম্ভব তা প্রায় অভিন্ন।
প্রোগ্রামার ব্রুস

17
Gweebz - সম্ভবত আপনি ব্যাখ্যা করতে চান আপনি কেন GSON একটি ভাল পছন্দ (জ্যাকসনের তুলনায়) বেশি পছন্দ?
স্টেক্সম্যান

উত্তর:


1653

প্রথমে একটি ম্যাপার তৈরি করুন:

import com.fasterxml.jackson.databind.ObjectMapper;// in play 2.3
ObjectMapper mapper = new ObjectMapper();

অ্যারে হিসাবে:

MyClass[] myObjects = mapper.readValue(json, MyClass[].class);

তালিকা হিসাবে:

List<MyClass> myObjects = mapper.readValue(jsonInput, new TypeReference<List<MyClass>>(){});

তালিকার প্রকারটি নির্দিষ্ট করার জন্য আরেকটি উপায়:

List<MyClass> myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));

43
একটি অতিরিক্ত নোট, পার্স করার সময় আপনি যদি কোনও ত্রুটি পেয়ে থাকেন JsonMappingException: No suitable constructor found for typeতবে এর অর্থ এটি আপনার ক্লাসে একটি ডিফল্ট কনস্ট্রাক্টর যুক্ত করা দরকার এটি একটি প্রাইভেট নো-আরগ কনস্ট্রাক্টর আমার জন্য স্থির করে।
সিনট্যাক্সস বিধিগুলি

12
@ সাইনট্যাক্স রুলস সুস্পষ্ট কন্সট্রাক্টর যুক্ত করা আপনার প্রয়োজনীয় স্পষ্ট নির্মাণকারী প্রয়োজন - যদি তা না হয় তবে সংকলক স্বয়ংক্রিয়ভাবে সর্বজনীন "খালি" কনস্ট্রাক্টর তৈরি করে। ভাল যুক্তি. আর একটি সাধারণ সমস্যা হল অভ্যন্তরীণ ক্লাসগুলি হওয়া দরকার static- অন্যথায় তাদের কখনই শূন্য-আরগ নির্মাণকারী থাকে না।
স্টেক্সম্যান

244
BTW, List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class))দ্রুত TypeRefence তুলনায় 10 সময় পর্যন্ত কাজ করে।

5
আমি একটি জেনেরিক ধরণের সংস্করণ খুঁজছি।
স্টিফেন

1
@ ইউজেনটিসখোভেরেভভ আপনার উপায়টি ইনলাইনিংয়ের জন্য সবচেয়ে পরিষ্কার। অন্যদের castালাই বা ঘোষণার প্রয়োজন। আমি এটিকে হাইলাইট করতে সহায়তা করার জন্য এটির নিজস্ব উত্তর হিসাবে যুক্ত করার পরামর্শ দিচ্ছি এবং আপনাকে কিছু খ্যাতি দেবো।
এরিক বি

190

ইউজিন সখভোরেভভ থেকে

List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class))

এই সমাধানটি আমার কাছে সেরা বলে মনে হচ্ছে


জাভাতে লোটাস ডমিনোতে এজেন্টদের সাথে যারা কাজ করছেন তাদের পক্ষে এটিই। আমি অন্যান্য কয়েকটি সমাধানের চেষ্টা করেছি, তবে সর্বদা একটি পেয়েছিResourceNotFoundException
জন

উপরের উত্তরের মন্তব্যে সিনট্যাক্স রুলস সংযোজনের জন্য এই সমাধানের প্রয়োজন হতে পারে যেমনটি আমরা, এটি আমার জন্য ছিল। আমি এটি যুক্ত করতে চেয়েছিলাম যাতে এটি যেন হারিয়ে না যায়।
রব

2
বাArrays.asList(Json.fromJson(json.get("fieldName"), MyClass[].class))
আল মোতাহাফার

3
বাList<MyClass> myObjects = Arrays.asList(mapper.treeToValue(jsonNode.get("fieldName"), MyClass[].class))
কলিন ক্রাওল

নিবন্ধন করুন
এশ্বর

35

জেনেরিক বাস্তবায়নের জন্য:

public static <T> List<T> parseJsonArray(String json,
                                         Class<T> classOnWhichArrayIsDefined) 
                                         throws IOException, ClassNotFoundException {
   ObjectMapper mapper = new ObjectMapper();
   Class<T[]> arrayClass = (Class<T[]>) Class.forName("[L" + classOnWhichArrayIsDefined.getName() + ";");
   T[] objects = mapper.readValue(json, arrayClass);
   return Arrays.asList(objects);
}

4
ক্লাস <টি []] এর ভাল নির্মাণ। এটি কখনও দেখেনি। আপনি এই সম্পর্কে তথ্য কোথায় পেলেন?
রোল্যান্ড ভ্যান হেডেজেম

11

প্রথমে অবজেক্টরিডারের একটি উদাহরণ তৈরি করুন যা থ্রেড-নিরাপদ safe

ObjectMapper objectMapper = new ObjectMapper();
ObjectReader objectReader = objectMapper.reader().forType(new TypeReference<List<MyClass>>(){});

তারপরে এটি ব্যবহার করুন:

List<MyClass> result = objectReader.readValue(inputStream);

এটি হ'ল আমি যা খুঁজছি, ধন্যবাদ
একা দাঁড়িয়ে

আমরা পেয়েছি - com.fasterxML.jackson.databind.JsonMappingEception: java.util.ArrayList এর উদাহরণটি deOrialize করতে পারবেন না [সূত্র: java.io.FileInputStream@33fec21; লাইন: 1, কলাম: 1]
দিনেশ কুমার

7
try {
    ObjectMapper mapper = new ObjectMapper();
    JsonFactory f = new JsonFactory();
    List<User> lstUser = null;
    JsonParser jp = f.createJsonParser(new File("C:\\maven\\user.json"));
    TypeReference<List<User>> tRef = new TypeReference<List<User>>() {};
    lstUser = mapper.readValue(jp, tRef);
    for (User user : lstUser) {
        System.out.println(user.toString());
    }

} catch (JsonGenerationException e) {
    e.printStackTrace();
} catch (JsonMappingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

3

এখানে একটি ইউটিলিটি রয়েছে যা আপনার পোজো (সত্তা টি) যাই হোক না কেন json2object বা অবজেক্ট 2 জসনের রূপান্তর করতে পারে

import java.io.IOException;
import java.io.StringWriter;
import java.util.List;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

/**
 * 
 * @author TIAGO.MEDICI
 * 
 */
public class JsonUtils {

    public static boolean isJSONValid(String jsonInString) {
        try {
            final ObjectMapper mapper = new ObjectMapper();
            mapper.readTree(jsonInString);
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    public static String serializeAsJsonString(Object object) throws JsonGenerationException, JsonMappingException, IOException {
        ObjectMapper objMapper = new ObjectMapper();
        objMapper.enable(SerializationFeature.INDENT_OUTPUT);
        objMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        StringWriter sw = new StringWriter();
        objMapper.writeValue(sw, object);
        return sw.toString();
    }

    public static String serializeAsJsonString(Object object, boolean indent) throws JsonGenerationException, JsonMappingException, IOException {
        ObjectMapper objMapper = new ObjectMapper();
        if (indent == true) {
            objMapper.enable(SerializationFeature.INDENT_OUTPUT);
            objMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        }

        StringWriter stringWriter = new StringWriter();
        objMapper.writeValue(stringWriter, object);
        return stringWriter.toString();
    }

    public static <T> T jsonStringToObject(String content, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
        T obj = null;
        ObjectMapper objMapper = new ObjectMapper();
        obj = objMapper.readValue(content, clazz);
        return obj;
    }

    @SuppressWarnings("rawtypes")
    public static <T> T jsonStringToObjectArray(String content) throws JsonParseException, JsonMappingException, IOException {
        T obj = null;
        ObjectMapper mapper = new ObjectMapper();
        obj = mapper.readValue(content, new TypeReference<List>() {
        });
        return obj;
    }

    public static <T> T jsonStringToObjectArray(String content, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
        T obj = null;
        ObjectMapper mapper = new ObjectMapper();
        mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        obj = mapper.readValue(content, mapper.getTypeFactory().constructCollectionType(List.class, clazz));
        return obj;
    }

0

আপনি এমন একটি বর্গ তৈরি করতে পারেন যা প্রসারিত ArrayList:

public static class MyList extends ArrayList<Myclass> {}

এবং তারপরে এটি ব্যবহার করুন:

List<MyClass> list = objectMapper.readValue(json, MyList.class);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.