java - जैक्सन JSON के साथ एक JSON स्ट्रिंग को मानचित्र<स्ट्रिंग, स्ट्रिंग>में कैसे परिवर्तित करें




jackson (9)

मैं ऐसा कुछ करने की कोशिश कर रहा हूं लेकिन यह काम नहीं करता है:

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

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

लेकिन आईडीई कहते हैं:

अनचेक असाइनमेंट Map to Map<String,String>

ऐसा करने का सही तरीका क्या है? मैं केवल जैक्सन का उपयोग कर रहा हूं क्योंकि यह प्रोजेक्ट में पहले से ही उपलब्ध है, क्या JSON में / से कनवर्ट करने का मूल जावा तरीका है?

PHP में मैं बस json_decode($str) और मैं एक सरणी वापस प्राप्त करूंगा। मुझे मूल रूप से वही चीज़ चाहिए।


Answers

आपको प्राप्त चेतावनी संकलक द्वारा की जाती है, लाइब्रेरी (या उपयोगिता विधि) द्वारा नहीं।

सीधे जैक्सन का उपयोग करने का सबसे आसान तरीका होगा:

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

उपयोगिता विधि जिसे आप शायद कॉल करते हैं, बस इसी तरह कुछ करता है।


इस समस्या का सामान्य समाधान यहां दिया गया है।

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

उम्मीद है कि किसी दिन किसी भी कुंजी / मूल्य प्रकार के मानचित्र में कनवर्ट करने के लिए उपयोग विधि बनाने के लिए सोचा जाएगा इसलिए यह जवाब :)


Google के जीसन का उपयोग करना

here बताए गए Google के जीसन का उपयोग क्यों नहीं here ?

बहुत सीधे आगे और मेरे लिए नौकरी की:

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

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

मुझे लगता है कि यह आपकी समस्या का समाधान करेगा।


मेरे लिए निम्नलिखित काम करता है:

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"
}

ऑब्जेक्ट मैपर का उपयोग करके इस समस्या का सामान्य समाधान यहां दिया गया है।

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

उम्मीद है कि किसी दिन किसी भी कुंजी / मूल्य प्रकार के मानचित्र में कनवर्ट करने के लिए उपयोग विधि बनाने के लिए सोचा जाएगा इसलिए यह जवाब :)


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

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

ध्यान दें कि reader उदाहरण थ्रेड सुरक्षित है।


TypeFactory आज़माएं। जैक्सन जेएसओएन (2.8.4) के लिए कोड यहां दिया गया है।

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

जैक्सन JSON के पुराने संस्करण के लिए कोड यहां दिया गया है।

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

अपने अपवाद के ढेर को प्रदर्शित करने के लिए exp.printStackTrace() उपयोग करें।

try {
   int zero = 1 - 1;
   int a = 1/zero;
} catch (Exception e) {
    e.printStackTrace();
}




java jackson