জ্যাকসন জেএসওনের সাথে কীভাবে জেএসএন স্ট্রিংকে মানচিত্র <স্ট্রিং, স্ট্রিং> এ রূপান্তর করবেন


184

আমি এই জাতীয় কিছু করার চেষ্টা করছি কিন্তু এটি কার্যকর হয় না:

Map<String, String> propertyMap = new HashMap<String, String>();

propertyMap = JacksonUtils.fromJSON(properties, Map.class);

তবে আইডিই বলে:

চেক করা অ্যাসাইনমেন্ট Map to Map<String,String>

এটি করার সঠিক উপায় কী? আমি কেবল জ্যাকসনকেই ব্যবহার করছি কারণ প্রকল্পটিতে এটি ইতিমধ্যে উপলব্ধ, জেএসএন থেকে / থেকে রূপান্তর করার কোনও দেশীয় জাভা উপায় আছে?

পিএইচপি-তে আমি সহজভাবে json_decode($str)চাই এবং আমি একটি অ্যারে ফিরে পাই। আমি এখানে মূলত একই জিনিস প্রয়োজন।


জ্যাকসন ইউটিলস ক্লাসটি কোথা থেকে আসছে? আমি এটি জ্যাকসনের কোনও রিলিজেই দেখছি না।
রব হাইজার

এটি জ্যাকসনের জন্য আমাদের মোড়ক, আপনাকে করতে হবে এমন কিছু জাসনফ্যাক্টরি এবং অবজেক্টম্যাপার সামগ্রী পরিচালনা করে।
adamJLev

1
সুতরাং, সমস্যাটি হ'ল জ্যাকসন ইউটিলস.ফর্ম জেএসএন () মানচিত্র <স্ট্রিং, স্ট্রিং>, কেবলমাত্র মানচিত্র ফেরত দেওয়ার ঘোষণা দেয় নি।
রব হাইজার

7
বিটিডব্লিউ, সেখানে প্রথম লাইনে নতুন হ্যাশম্যাপ বরাদ্দ করবেন না: এটি উপেক্ষা করে যায়। শুধু কল এ্যাসিং।
স্ট্যাকসমান

শিরোনামটির আপনার বর্ণিত সমস্যার সাথে কোনও সম্পর্ক নেই, যা টাইপযুক্ত সংগ্রহের সাথে সম্পর্কিত। নীচের উত্তরটি হ'ল আপনি যা জিজ্ঞাসা করার চেষ্টা করেছিলেন তার সঠিক উত্তর।
Jukka Dahlbom

উত্তর:


312

আমি নিম্নলিখিত কোড পেয়েছি:

public void testJackson() throws IOException {  
    ObjectMapper mapper = new ObjectMapper(); 
    File from = new File("albumnList.txt"); 
    TypeReference<HashMap<String,Object>> typeRef 
            = new TypeReference<HashMap<String,Object>>() {};

    HashMap<String,Object> o = mapper.readValue(from, typeRef); 
    System.out.println("Got " + o); 
}   

এটি কোনও ফাইল থেকে পড়ছে, তবে mapper.readValue()এটি গ্রহণ করবে এবং নিম্নলিখিতটি ব্যবহার করে আপনি স্ট্রিং থেকে একটি InputStreamপেতে পারেন InputStream:

new ByteArrayInputStream(astring.getBytes("UTF-8")); 

আমার ব্লগে ম্যাপার সম্পর্কে আরও কিছু ব্যাখ্যা রয়েছে ।


2
@ সুরজ, এটি ডকুমেন্টেশন অনুসারে, এবং আমি সম্মত যে আমি প্রথম নীতিগুলি থেকে সূত্রটি কাটাতে সক্ষম হতে পারতাম না। এটি যতটা অদ্ভুত নয় তা দেখানোর চেয়ে জাভা আরও জটিল showing
djna

1
ক্রিঞ্জ: আমি ভেবেছিলাম হার্ড বিট ম্যাপারটি পাচ্ছে, তবে কীভাবে কৌশলটি স্ট্রিংয়ে প্রয়োগ করতে হবে সে সম্পর্কে আমি নোটটি যুক্ত করেছি
djna

2
একটি গৌণ মন্তব্য: তৈরির প্রথম লাইনের JsonFactoryপ্রয়োজন নেই। ObjectMapperএটি স্বয়ংক্রিয়ভাবে এটিকে তৈরি করতে পারে।
স্টেক্সম্যান 18

1
@ ডিজেনা পোস্টারটি চেয়েছে Map<String, String>এবং আপনি সরবরাহ করেছেন Map<String, Object>
anon58192932

স্ট্রিং হিসাবে মানচিত্রটি লিখতে আপনি করতে পারেনmapper.writeValueAsString(hashmap)
জহির

53

ব্যবহার করে দেখুন TypeFactory। জ্যাকসন জেএসন (২.৮.৪) এর কোড এখানে।

Map<String, String> result;
ObjectMapper mapper;
TypeFactory factory;
MapType type;

factory = TypeFactory.defaultInstance();
type    = factory.constructMapType(HashMap.class, String.class, String.class);
mapper  = new ObjectMapper();
result  = mapper.readValue(data, type);

জ্যাকসন জেএসন-এর পুরানো সংস্করণের কোড এখানে।

Map<String, String> result = new ObjectMapper().readValue(
    data, TypeFactory.mapType(HashMap.class, String.class, String.class));

38
টাইপফ্যাক্টরি.ম্যাপটাইপ (...) এখন অবচয় করা হয়েছে, এটি চেষ্টা করে দেখুন: নতুন টাইপরেফারেন্স <হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং >> () {}
সাইবার-সন্ন্যাস

2
@ সাইবার-সন্ন্যাসী এটি সতর্কতা থেকে মুক্তি পেয়েছে তবে বাস্তবে প্রকারগুলি পরীক্ষা করে না।
ডেভিড মোল 21

26

আপনি যে সতর্কতাটি পেয়েছেন তা পাঠক (বা ইউটিলিটি পদ্ধতি) দ্বারা নয়, সংকলক দ্বারা সম্পন্ন হয়েছে।

জ্যাকসনকে সরাসরি ব্যবহার করার সহজ উপায় হ'ল:

HashMap<String,Object> props;

// src is a File, InputStream, String or such
props = new ObjectMapper().readValue(src, new TypeReference<HashMap<String,Object>>() {});
// or:
props = (HashMap<String,Object>) new ObjectMapper().readValue(src, HashMap.class);
// or even just:
@SuppressWarnings("unchecked") // suppresses typed/untype mismatch warnings, which is harmless
props = new ObjectMapper().readValue(src, HashMap.class);

আপনি যে ইউটিলিটি পদ্ধতিটি কল করেছেন সম্ভবত এটির মতোই কিছু করে।


ওপি আপনাকে জিজ্ঞাসা করেছে Map<String, String>এবং আপনি সরবরাহ করেছেন Map<String, Object>
anon58192932

18
ObjectReader reader = new ObjectMapper().readerFor(Map.class);

Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");

নোট করুন যে readerথ্রেড নিরাপদ।


@ ডেটেরুহা ওপি আপনাকে জিজ্ঞাসা করেছে Map<String, String>এবং আপনি সরবরাহ করেছেন Map<String, Object>
anon58192932

10

স্ট্রিং থেকে জেএসএন মানচিত্রে রূপান্তর করা:

Map<String,String> map = new HashMap<String,String>();

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);

4
উপরে এখনও ফলাফল Type safety: The expression of type HashMap needs unchecked conversion to conform to Map<String,String>। যদিও এটিকে @SuppressWarningsটীকা দিয়ে চাপা দেওয়া যেতে পারে , আমি TypeReferenceস্ট্যাক্সম্যান দ্বারা উল্লিখিত হিসাবে প্রথম বা পরবর্তী কাস্টিং ব্যবহার করার পরামর্শ দেব
রঘুপতি

1
ধরণের সুরক্ষা সতর্কতা থেকে মুক্তি পেতে আপনি ব্যবহার করতে পারেন map = mapper.readValue(string, map.getClass());- আপনি যেমন মানচিত্রটি ইনস্ট্যান্ট করেছেন তা এখানে যেমন রয়েছে।
এমজেভি

যদি ভেরর ধরণ মানচিত্র <পূর্ণসংখ্যা, স্ট্রিং> হয় তবে কেবলমাত্র বস্তুর শ্রেণিটি ঠিক নয়।
জিয়ায়ু ওয়াং

5
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);

আমি মনে করি এটি আপনার সমস্যার সমাধান করবে।


1
জাভা ডকটিতে: @ 2.5 এর চেয়ে বেশি - তবে সম্ভবত 2.7 বা 2.8 এ অবমূল্যায়ন করা হবে (২.7 দিয়ে দরকার নেই)
আল-মোতাহাফার

3

নিম্নলিখিতটি আমার পক্ষে কাজ করে:

Map<String, String> propertyMap = getJsonAsMap(json);

যেখানে getJsonAsMapযেমন সংজ্ঞায়িত করা হয়:

public HashMap<String, String> getJsonAsMap(String json)
{
    try
    {
        ObjectMapper mapper = new ObjectMapper();
        TypeReference<Map<String,String>> typeRef = new TypeReference<Map<String,String>>() {};
        HashMap<String, String> result = mapper.readValue(json, typeRef);

        return result;
    }
    catch (Exception e)
    {
        throw new RuntimeException("Couldnt parse json:" + json, e);
    }
}

মনে রাখবেন যে আপনার জসনগুলিতে যদি আপনার শিশু বস্তু থাকে তবে এটি ব্যর্থ হবে (কারণ তারা একটি নয় String, তারা অন্য একজন HashMap), তবে আপনার জেসন যদি এর মতো বৈশিষ্ট্যের মূল মান তালিকা হয় তবে এটি কাজ করবে:

{
    "client_id": "my super id",
    "exp": 1481918304,
    "iat": "1450382274",
    "url": "http://www.example.com"
}

3

গুগলের জিসন ব্যবহার করা

এখানে উল্লিখিত হিসাবে গুগলের জিসন ব্যবহার করবেন না কেন ?

খুব সোজা এগিয়ে এবং আমার জন্য কাজটি করেছেন:

HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());

1
সম্মত, বিশ্ব এগিয়ে গেছে, গসন ব্যবহার করা অনেক সহজ easier
djna

1

এই সমস্যার জেনেরিক সমাধান এখানে।

public static <K extends Object, V extends Object> Map<K, V> getJsonAsMap(String json, K key, V value) {
    try {
      ObjectMapper mapper = new ObjectMapper();
      TypeReference<Map<K, V>> typeRef = new TypeReference<Map<K, V>>() {
      };
      return mapper.readValue(json, typeRef);
    } catch (Exception e) {
      throw new RuntimeException("Couldnt parse json:" + json, e);
    }
  }

আশা করি কোনও দিন কোনও মানচিত্রের কী / মান ধরণের রূপান্তর করতে কোনও ব্যবহার পদ্ধতি তৈরি করার কথা ভাববেন তাই এই উত্তরটি :)


-1

শুধু একটি কোটলিন উত্তর দিতে চেয়েছিলেন

val propertyMap = objectMapper.readValue<Map<String,String>>(properties, object : TypeReference<Map<String, String>>() {})

হুঁ, কেন এটিকে নিম্নমানের করা হয়েছে তা নিশ্চিত নন। এই লাইনটি কেবল আমার পক্ষে কাজ করে না, এটি সঠিক উপায়ে করার চাবিও দেয়। মানচিত্র <স্ট্রিং, স্ট্রিং> কে অন্য পছন্দসই প্রকারের সাথে প্রতিস্থাপন করে ম্যাপার স্ট্রিংটিকে তালিকা <মাইবজেক্ট>, বা তালিকা <ম্যাপ <স্ট্রিং, মাইবজেক্ট >>
ডাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.