পাইথন অভিধানকে JSON অ্যারে রূপান্তর করুন


100

বর্তমানে আমার কাছে এই অভিধানটি ব্যবহার করে মুদ্রিত হয়েছে pprint:

{'AlarmExTempHum': '\x00\x00\x00\x00\x00\x00\x00\x00',  
'AlarmIn': 0,  
'AlarmOut': '\x00\x00',  
'AlarmRain': 0,  
'AlarmSoilLeaf': '\x00\x00\x00\x00',  
'BarTrend': 60,  
'BatteryStatus': 0,  
'BatteryVolts': 4.751953125,  
'CRC': 55003,
'EOL': '\n\r',
'ETDay': 0,
'ETMonth': 0,
'ETYear': 0,
'ExtraHum1': None,
'ExtraHum2': None,
'ExtraHum3': None,
'ExtraHum4': None,
'ExtraHum5': None,
'ExtraHum6': None,
'ExtraHum7': None,
'ExtraTemp1': None,
'ExtraTemp2': None,
'ExtraTemp3': None,
'ExtraTemp4': None,
'ExtraTemp5': None,
'ExtraTemp6': None,
'ExtraTemp7': None,
'ForecastIcon': 2,
'ForecastRuleNo': 122,
'HumIn': 31,
'HumOut': 94,
'LOO': 'LOO',
'LeafTemps': '\xff\xff\xff\xff',
'LeafWetness': '\xff\xff\xff\x00',
'NextRec': 37,
'PacketType': 0,
'Pressure': 995.9363359295631,
'RainDay': 0.0,
'RainMonth': 0.0,
'RainRate': 0.0,
'RainStorm': 0.0,
'RainYear': 2.8,
'SoilMoist': '\xff\xff\xff\xff',
'SoilTemps': '\xff\xff\xff\xff',
'SolarRad': None,
'StormStartDate': '2127-15-31',
'SunRise': 849,
'SunSet': 1611,
'TempIn': 21.38888888888889,
'TempOut': 0.8888888888888897,
'UV': None,
'WindDir': 219,
'WindSpeed': 3.6,
'WindSpeed10Min': 3.6}

আমি যখন এটি করি:

import json
d = (my dictionary above)
jsonarray = json.dumps(d)

আমি এই ত্রুটি পেয়েছি: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte


আপনার সমস্যাটি এখানে রয়েছে:\xff
বেনজমিন তোয়েগ

উত্তর:


168

আপনি যদি আপনার জসন-এ-প্রিন্টযোগ্য চিহ্নগুলির সাথে ভাল থাকেন তবে কল ensure_ascii=Falseকরতে যুক্ত dumpsকরুন।

>>> json.dumps(your_data, ensure_ascii=False)

যদি ensure_asciiমিথ্যা হয়, তাহলে ফেরত মান একটি হতে হবে unicodeস্বাভাবিক পাইথন করার দৃষ্টান্ত বিষয় strথেকে unicode পরিবর্তে একটি হওয়া ASCII পালিয়ে হচ্ছে বলপ্রয়োগ নিয়ম str


4
indent=nচমত্কার মুদ্রণের বিকল্পগুলিতে যুক্ত করুন, nফাঁকা স্থানগুলির সংখ্যা কোথায়
আরটিএফ

17

নিশ্চিত_আএসসিআই = মিথ্যা সত্যই কেবল এই সমস্যাটিকে ডিকোডিং পর্যায়ে ফেলে দেয়:

>>> dict2 = {'LeafTemps': '\xff\xff\xff\xff',}
>>> json1 = json.dumps(dict2, ensure_ascii=False)
>>> print(json1)
{"LeafTemps": "����"}
>>> json.loads(json1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 328, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

শেষ পর্যন্ত আপনি কোনও জেএসওএন নথিতে কাঁচা বাইট সংরক্ষণ করতে পারবেন না, সুতরাং আপনি এএসসিআইআই স্ট্রিং - যেমন বেস64 হিসাবে নির্বিচারে বৌদ্ধের ক্রমকে এনকোডিংয়ের কিছু উপায় ব্যবহার করতে চাইবেন।

>>> import json
>>> from base64 import b64encode, b64decode
>>> my_dict = {'LeafTemps': '\xff\xff\xff\xff',} 
>>> my_dict['LeafTemps'] = b64encode(my_dict['LeafTemps'])
>>> json.dumps(my_dict)
'{"LeafTemps": "/////w=="}'
>>> json.loads(json.dumps(my_dict))
{u'LeafTemps': u'/////w=='}
>>> new_dict = json.loads(json.dumps(my_dict))
>>> new_dict['LeafTemps'] = b64decode(new_dict['LeafTemps'])
>>> print new_dict
{u'LeafTemps': '\xff\xff\xff\xff'}

আপনি '
ল্যাটিন

4
আপনি মনে করতে পারেন, তবে জসন ইউটিএফ -8 ব্যবহার করার জন্য নকশা করা হয়েছে।
কার্ল নচেটেল

4
@ জেএসএবেস্টিয়ান: তুলনায় সত্যই, খুব অদক্ষ b64encode। উদাহরণস্বরূপ, 256 অক্ষরের স্ট্রিংয়ের জন্য s = ''.join(chr(i) for i in xrange(256)), len(json.dumps(b64encode(s))) == 346বনাম len(json.dumps(s.decode('latin1'))) == 1045
মার্টিনিউ

10

আপনি যদি পাইথন 2 ব্যবহার করেন তবে আপনার স্ক্রিপ্টের প্রথম লাইনে UTF-8 ফাইল এনকোডিং মন্তব্য যুক্ত করতে ভুলবেন না।

# -*- coding: UTF-8 -*-

এটি কিছু ইউনিকোড সমস্যা সমাধান করবে এবং আপনার জীবনকে আরও সহজ করবে।


2

একটি সম্ভাব্য সমাধান যা আমি ব্যবহার করি তা হল পাইথন 3 ব্যবহার করা। দেখে মনে হচ্ছে অনেকগুলি সমস্যা সমাধান হয়েছে।

দেরিতে উত্তরের জন্য দুঃখিত, তবে এটি ভবিষ্যতে লোকদের সহায়তা করতে পারে।

উদাহরণ স্বরূপ,

#!/usr/bin/env python3
import json
# your code follows

4
অবশ্যই, আপনি অভিশাপ ডান, পাইথন 3 অনেকগুলি এনকোডিংয়ের সমস্যা সমাধান করেছে। তবে সে প্রশ্নের উত্তর নয়। এটি স্পষ্টভাবে পাইথন -২.7 সহ ট্যাগ করা হয়েছে। সুতরাং আপনি যা বলছেন তা হ'ল: আপনার পুরানো গাড়িতে কোনও বিল্ট-ইন ভ্যাকুয়াম ক্লিনার নেই। সুতরাং দয়া করে আপনার পুরানো গাড়িতে ভ্যাকুয়াম ক্লিনার যোগ করার পরিবর্তে একটি নতুন গাড়ি কিনুন।
কলিডিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.