/ / सामान्य जेन्स पार्सिंग कोड कैसे बनाएं? - json, पार्सिंग, अमृत

जेनेरिक JSON पार्सिंग कोड कैसे बनाएं? - जेसन, पार्सिंग, इलीक्सिर

तो मैं एक सूची के साथ कुछ jars के पार्स करके लौटा हूँ jsx। मैं किसी विशेष नाम के साथ टपल की खोज करके कुछ चयनित मानों को खींच रहा हूं, जैसे:

defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""

मैं कई अलग-अलग तत्वों के लिए यही काम कर रहा हूं जिन्हें मैं निकालना चाहता हूं और जब मुझे बहुत सारे कोड दिखाई देते हैं जो केवल एक पैरामीटर पर भिन्न होते हैं, तो मैं एक खराब कोड गंध को सूंघता हूं। मेरा मतलब है कि इस तरह का कोड:

defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""

defp get_last_updated([{"last updated",_last_updated | _t]), do: _last_updated
defp get_last_updated([_h | _t]), do: get_last_updated(_t)
defp get_last_updated([]), do: ""

defp get_creator([{"creator",_creator} | _t]), do: _creator
defp get_creator([_h | _t]), do: get_creator(_t)
defp get_creator([]), do: ""

मेरे लिए DRY सिद्धांत के उल्लंघन की बू आ रही है।

इसलिए मैंने सोचा कि मैं ऐसा कुछ कर सकता हूं:

defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
defp get_json_element([_h | _t]), do: get_json_element(_t)
defp get_json_element([]), do: ""

लेकिन यह मानते हुए कि यह काम करेगा (यह संकलित करता है लेकिन मुझे यकीन नहीं है कि यह वही होगा जो मैं चाहता हूं), मैं इसे कैसे कह सकता हूं? मैं "टी" कॉल कर सकता हूं get_json_element(["link", _link]) (या कम से कम मुझे नहीं लगता कि मैं कर सकता हूँ) मेरा मतलब हैआम तौर पर मैं विभिन्न get_X फ़ंक्शंस के लिए jsx.decode द्वारा दी गई सूची को पास कर सकता हूं, लेकिन फिर मैं पैटर्न मिलान अभिव्यक्ति कैसे पास कर सकता हूं? मुझे "क्षमा करें - मुझे नहीं लगता कि मैंने अपना प्रश्न बहुत अच्छी तरह से व्यक्त किया है लेकिन मैं कर सकता हूं "यह कैसे बेहतर वाक्यांश के लिए पता लगाना।

क्या यह उन मामलों में से एक है जहां मुझे दोहराव वाले कोड को कम करने के लिए मैक्रो का उपयोग करना चाहिए? यदि हां, तो क्या किसी ने पहले से ही इस तरह का एक मैक्रो लिखा है?

यह भी सोच रहा था कि क्या एक खाली स्ट्रिंग को इंगित करने का एक बेहतर तरीका है। "" सिर्फ doesn "t का उपयोग करना मेरे लिए सबसे अच्छा तरीका है। या वहाँ एक और मूल्य है कि मैं वापस आ सकता है? शायद नील लौटा दें?

उत्तर:

जवाब के लिए 2 № 1

आप निश्चित रूप से एक मैक्रो का उपयोग कर सकते हैं

आप उपयोग कर सकते हैं https://github.com/Licenser/jsxd पुस्तकालय jsx द्वारा लौटाए गए डेटा संरचनाओं में हेरफेर करने के लिए

आप एक सामान्य कार्य का उपयोग कर सकते हैं

def get(json, key, default \ nil) do
case List.keyfind(json, key, 0, default) do
{^key, value} -> value
^default -> default
end
end

आपका समाधान

defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
defp get_json_element([_h | _t]), do: get_json_element(_t)
defp get_json_element([]), do: ""

काम नहीं करेगा क्योंकि {element_to_get, value_of_element} एक ही आकार के साथ किसी भी tuple मैच होगा {_, _}