2015-03-19 5 views
5

मैं जावास्क्रिप्ट कोड के अंदर एक डेटा संरचना उत्पन्न करने की कोशिश कर रहा हूं, और जावा से परिणामों को संसाधित करता हूं (जावा 6 या 7 में राइनो)।मैं जावा डेटास्ट्रक्चर में राइनो-निर्मित जेएसओएन डेटास्ट्रक्चर (नेटिव ऑब्जेक्ट) को कैसे परिवर्तित कर सकता हूं?

Object result = invocableEngine.invokeFunction(functionName, parameters); 

अब, जे एस तरफ, कि परिणाम एक JSON डेटा संरचना इस प्रकार है::

मैं का उपयोग कर जावा से जे एस समारोह लागू करने में सफल रहा

{ 
    "key1" : { "key1_1" : "value1_1", "key1_2" : 11 }, 

    "key2" : [ { "key2_1": "foo2" 
       , "key2_1" : "bar2" }, 

      { "key2_1": "foo2" 
       , "key2_1" : "bar2" 
       , "key2_3" : [1,2,3] } ] 
} 

जावा तरफ, हालांकि, "परिणाम" प्रकार sun.org.mozilla.javascript.internal.NativeObject

का एक ऑब्जेक्ट है जो मुझे उचित जावा डेटास्ट्रक्चरमें परिवर्तित करने का कोई तरीका है, जेएसओएन को स्ट्रिंग में क्रमबद्ध करने के ऊपरी हिस्से के बिना और फिर इसे रोकने के लिए जीसन का उपयोग कर?

इस समय के लिए मान लें कि डेटा संरचना उचित रूप से अच्छी तरह परिभाषित है, उदा। मुझे पता है कि ऑब्जेक्ट हैश "कुंजी 1" और "की 2" के साथ हैश है, कुंजी के साथ हैश के पहले नक्शे "key1_1" और "key1_2"; दूसरे नक्शे हैंश की एक सरणी में, जिनमें से प्रत्येक में "key2_1" और "key2_2" कुंजी हैं जो स्केलर और "key2_3" हैं जो एक सरणी है।

मेरे 2 प्राथमिकताओं इसी क्रम में, कर रहे हैं:

  1. प्रदर्शन (जो एक कारण है कि मैं serialize + Gson-पार्स से सावधान कर रहा हूँ है)
  2. जावा 6, 7 और 8 (हालांकि बीच
  3. पोर्टेबिलिटी , मैं एक भौतिक रूप से तेजी से गैर पोर्टेबल समाधान पसंद करेंगे)।
+0

वहाँ राइनो प्रारूप में इसे छोड़ने और उस डेटा के माध्यम से उस तक पहुंचने में साथ एक समस्या है संरचना? मैं मानता हूं कि इसमें कुछ ओवरहेड होगा लेकिन मुझे नहीं लगता कि स्ट्रिंग और deserializing में परिवर्तित किए बिना कोई विकल्प हैं। – ghostbust555

+0

@ ghostbust555 - मुझे लगता है कि "राइनो प्रारूप के माध्यम से पहुंचना" एक वैध दृष्टिकोण है, लेकिन यह सुनिश्चित नहीं है कि यह कैसे करें।ऐसा लगता है कि मुझे लगता है कि कोई सभ्य दस्तावेज नहीं है, खासकर हैश – DVK

+0

हुह के लिए। वाह वे सभी समय के सबसे खराब दस्तावेज है। परिणाम का प्रयास करें .getAttributes ("key1")? – ghostbust555

उत्तर

0

आप एक LinkedTreeMap में पार्स करने, इस तरह से किसी भी json स्ट्रिंग "वस्तु" Gson का उपयोग कर पार्स कर सकते हैं:

import com.google.gson.internal.LinkedTreeMap; 

String json = <your raw json> 
LinkedTreeMap map = new Gson().fromJson(json, LinkedTreeMap.class); 

अपने नमूना इनपुट पार्स करने के बाद, यह इस प्रकार का उपयोग करने के का एक उदाहरण है:

System.out.println(((List<LinkedTreeMap>)map.get("key2")).get(1).get("key2_3")); 

आउटपुट:

[1.0, 2.0, 3.0] 

यह संरचना को पहले से जानने में मदद करता है, लेकिन यह आवश्यक नहीं है क्योंकि आप इसे प्राप्त करने के बाद प्रत्येक नोड के प्रकार का निरीक्षण कर सकते हैं।

प्रदर्शन के लिए, मैंने सूची में 400 से अधिक प्रविष्टियों के साथ प्रत्येक 4 चाबियों के साथ नमूना इनपुट बनाया। एक जेवीएम चेतावनी देने के बाद, पार्सिंग ने मेरे लो-स्पेक पुराने लैपटॉप पर केवल 2ms लिया।

0

आप जेसन के अंदर से जावा ऑब्जेक्ट बना सकते हैं।

कुछ इस तरह (मैं नया java.lang.String निर्माण कर रहा हूँ, लेकिन इसी तरह आप अपने खुद के वर्ग का निर्माण कर सकते हैं):

java -jar js.jar 
Rhino 1.7 release 5 2015 01 29 
js> str=new java.lang.String("Hello world") 
Hello world 
js> java.lang.System.out.println(str) 
Hello world 
संबंधित मुद्दे