بعبارات عامة، جاكسون هي مكتبة فئة Java تستخدم لمعالجة بيانات تنسيق JSON، وأدائها جيد جدًا. ستقدم هذه المقالة مثالاً أكثر تفصيلاً لتحليل استخدام جاكسون. التفاصيل هي كما يلي:
1. مقدمة
يتمتع جاكسون بكفاءة عالية نسبيًا في التسلسل وإلغاء التسلسل، وفقًا للاختبارات، بغض النظر عن شكل التحويل، فإن Jackson > Gson > Json-lib، وقوة معالجة Jackson أعلى بحوالي 10 مرات من Json-lib، والجنس صحيح أيضًا. عالية جدا. في المقابل، يبدو أن Json-lib قد توقف عن التحديث، ويعتمد الإصدار الأحدث أيضًا على JDK15، بينما أصبح مجتمع Jackson أكثر نشاطًا.
أدناه، سوف نقدم بإيجاز استخدام جاكسون مع الأمثلة.
2. استخدم
يوفر جاكسون العديد من الفئات والأساليب، والفئة الأكثر استخدامًا في التسلسل وإلغاء التسلسل هي فئة ObjectMapper، والتي تشبه JsonObject وArrayObject في Json-lib. توفر هذه الفئة طرقًا مثل readTree() وreadValue() وwriteValueAsString() للتحويل. عنوان التوثيق المحدد لهذه الفئة هو: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
من أجل تجنب الأوصاف المتكررة، فإن objectMapper المذكور أدناه يأتي من ObjectMapper objectMapper = new ObjectMapper(). سيتم تقديم الاستخدام بإيجاز أدناه من حيث التسلسل وإلغاء التسلسل.
1. التسلسل
① إجراء تسلسل لفئات Java الخاصة
مثال اختباري
List list=new ArrayList();list.add(1);list.add(2);list.add(3);
تنفيذ التسلسل:
String teststringlist=objectMapper.writeValueAsString(list);System.out.println(teststringlist);
إخراج النتيجة على وحدة التحكم هو:
[1،2،3]
ختاماً:
يمكن لجاكسون تنفيذ تسلسل الأنواع العامة بسهولة.
②تسلسل الفئات المخصصة
مثال الاختبار:
public class Student {private int age=10;private String name="hhh"; public String[] list={"hao"،haouhao"،keyi"}; public Date time=new Date(); () { return age } public void setAge(int age) { this.age = age } public String getName() { return name } public void setName(String name) { this.name = name; }}
لجعل المثال أكثر عمومية، تتضمن هذه الفئة نوع القيمة int، ونوع المرجع String، وString[]، ونوع التاريخ Date.
تنفيذ التسلسل
Student st=new Student();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
إخراج النتيجة على وحدة التحكم هو:
{"list":["hao"، "haouhao"، "keyi"]، "time":1375429228382، "name": "hhh"، "age": 10}
ختاماً:
من خلال الإخراج، يمكن ملاحظة أن سلسلة Json المحولة تتوافق مع التنسيق. ومع ذلك، فإن تمثيل الوقت هو دون المستوى بعض الشيء. سيتم إدخال التعديلات على تنسيق الوقت أدناه.
③تعريف تنسيق الوقت
جاكسون لديه تنسيق زمني افتراضي خاص به، وهو على شكل طوابع زمنية، وتأثيره كما هو موضح في النتائج أعلاه (على سبيل المثال: 1375429228382). إذا كنت تريد تعيين هذا التنسيق غير صالح، قم بالتمرير
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS، خطأ)
يمكن ضبطه بحيث يستخدم توليد الوقت ما يسمى بالتدوين المتوافق مع [ISO-8601]، ويخرج وقتًا مشابهًا للتنسيق التالي: "1970-01-01T00:00:00.000+0000".
بالطبع، يمكنك أيضًا تخصيص تنسيق وقت الإخراج.
تنفيذ تنسيق الوقت المخصص
يستخدم المثال أيضًا فئة الطلاب المقدمة أعلاه.
Student st=new Student();java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
إخراج العيب على وحدة التحكم هو:
{"list":["hao"، "haouhao"، "keyi"]، "time": 2013-08-02 03:48:20"، "name": "hhh"، "age": 10}
ختاماً:
يمكن ملاحظة أن تنسيق إخراج الوقت أصبح ما نريده. تعد طريقة تحديد تنسيق إخراج الوقت في جاكسون أبسط بكثير من تحديد تنسيق الوقت في Json-lib.
④ طريقة تسلسل أخرى
تنفيذ التسلسل
المثال المستخدم لا يزال هو فصل الطالب السابق.
Student st=new Student();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st);
الإخراج على وحدة التحكم هو:
{"list":["hao"، "haouhao"، "keyi"]، "time":1375429228382، "name": "hhh"، "age": 10}
ختاماً:
يمكن لهذه الطريقة أيضًا الحصول على قيمة الطريقة المذكورة أعلاه. لكن انتبه لهذه الوظيفة في هذه الطريقة: createJsonGenerator()، والتي تتطلب معلمتين، إحداهما هي معلمة نوع OutputStream والأخرى هي معلمة نوع JsonEncoding. من خلال هاتين المعلمتين، يمكننا أن نفهم أن هذه الطريقة لا يمكنها كتابة Json مباشرة في دفق الشبكة فحسب، بل يمكنها أيضًا كتابة Json في دفق الملفات أو دفق الذاكرة. لذلك فهو أكثر تنوعًا.
2. إلغاء التسلسل
①إلغاء التسلسل لمرة واحدة
تستخدم هذه الطريقة بشكل أساسي طريقة القراءة <testJsonClass> (محتوى السلسلة، فئة <testJsonClass> valueType) التي يوفرها ObjectMapper. تتطلب هذه الطريقة إدخال سلسلة Json والفئة المقابلة للفئة التي يجب ملؤها، وإرجاع الفئة المعبأة.
تحليل سلسلة Json إلى فئة مخصصة
عندما تكون سلسلة Json:
String test1 = "{"objectID":357،"geoPoints":[{"x":504604.59802246094،"y":305569.9150390625}]}"
وقت.
أولا تحديد فئة:
public class testJsonClass { public int objectID public List GeoPoints=new ArrayList();}
ثم استخدم مقتطف التعليمات البرمجية التالي لإلغاء تسلسل Json في هذه الفئة:
testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
يستخدم
System.out.println(testClass.objectID);System.out.println(testClass.geoPoints)
القيم التي يمكنك رؤيتها على وحدة التحكم هي:
357[{x=504604.59802246094, ص=305569.9150390625}]
قم بإلغاء تسلسل سلسلة Json في فئة النظام الخاصة عندما تكون سلسلة Json
سلسلة جسون = "{"خطأ":0،"بيانات":{"name":"ABC"، "age":20،"الهاتف":{"home": "abc"، "mobile": "def"}،" الأصدقاء":[{"name":"DEF"،"الهاتف" :{"home":"hij"، "mobile": "klm"}}،{"name": "GHI"، "الهاتف": {"home": "nop"، "mobile": "qrs"} }]},"other":{"nickname":[]}}".
حدد متغيرًا باستخدام خريطة النظام الخاصة: خرائط Map<String, Map<String, Object>>. ثم استخدم Maps = objectMapper.readValue(json, Map.class) لإلغاء تسلسل Json في الخرائط المتغيرة.
يمر
System.out.println(maps.get("خطأ"));System.out.println((Object)(maps.get("data").get("phone")))
يمكنك الحصول على النتائج التالية في وحدة التحكم:
0 {الصفحة الرئيسية = اي بي سي، المحمول = ديف}
②إلغاء التسلسل التدريجي
تعد هذه الطريقة أكثر مرونة ويمكنها استخراج قيمة معلومات سلسلة Json التي يهتم بها المستخدم فقط. يتم تنفيذه بشكل أساسي باستخدام readTree المقدم من ObjectMapper وفئة JsonNode المقدمة من Jackson.
مثال اختباري
خيط اختبار = "{"النتائج":[{"objectID":357،"geoPoints":[{"x":504604.59802246094،"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
سلسلة Json هذه معقدة نسبيًا، بما في ذلك شكل المصفوفات المتداخلة، وهي عالمية.
تنفيذ إلغاء التسلسل
JsonNodeNode= objectMapper.readTree(test); // اقرأ سلسلة Json في الذاكرة في بنية شجرة JsonNode content=node.get("results");// احصل على المعلومات ضمن عقدة النتائج for(int i=0 أنا<contents.size();i++) // اجتياز المعلومات ضمن النتائج، يمكن لوظيفة size () الحصول على عدد المعلومات الموجودة في العقدة، على غرار طول المصفوفة {System.out.println(contents.get(i).get("objectID" ).getIntValue()); // اقرأ قيمة العقدة الفرعية تحت العقدة JsonNode GeoNumber=contents.get(i).get("geoPoints");for(int). j=0;j<geoNumber.size();j++) // قم بالتمرير عبر المعلومات الموجودة أسفل العقد الفرعية {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
الإخراج على وحدة التحكم هو:
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
ختاماً:
تشبه هذه الطريقة تحليل DOM في تحليل XML، وتتمثل الميزة في أن البنية مفصلة، مما يجعل من السهل استخراج المعلومات المطلوبة. بالطبع، العيب هو نفس هذه الطريقة: فهي تستغرق وقتًا ومكانًا.
3. ملخص
عمليات جاكسون على Json هي بشكل أساسي كما هو موضح أعلاه، وطريقتها مريحة جدًا للاستخدام ومرنة للغاية، وتوفر عمليات وعمليات لمرة واحدة يمكنها قراءة المعلومات عند الطلب. ولدى جاكسون مجموعة كاملة من الوظائف، والتي يمكنها التحكم في التسلسل وإلغاء التسلسل بتفاصيل مختلفة، مثل وظيفة التعليق التوضيحي، ووظيفة الحقن المؤجل للإسبات، وضبط وظيفة تنسيق الوقت، نظرًا لعدم الحاجة إلى هذه الوظائف حاليًا، فادرسها بعناية لوقت لاحق. في الوقت نفسه، يدعم جاكسون أيضًا سلسلة من عمليات التسلسل وإلغاء التسلسل على XML، والفكرة هي تقريبًا نفس فكرة تحليل Json.
فيما يتعلق بأوجه القصور الحالية في Jackson، فقد اختبر بعض الأشخاص على الإنترنت أنه يستهلك ذاكرة أكبر من Json-lib. إن استخدام المساحة للوقت أمر يستحق العناء بشكل عام.