سؤال

أريد أن أكون قادرا على الوصول إلى خصائص من سلسلة JSON ضمن طريقة عمل Java الخاصة بي. تتوفر السلسلة عن طريق القول ببساطة myJsonString = object.getJson(). وبعد فيما يلي مثال على ما يمكن أن تبدو السلسلة

{
    'title': 'ComputingandInformationsystems',
    'id': 1,
    'children': 'true',
    'groups': [{
        'title': 'LeveloneCIS',
        'id': 2,
        'children': 'true',
        'groups': [{
            'title': 'IntroToComputingandInternet',
            'id': 3,
            'children': 'false',
            'groups': []
        }]
    }]
}

في هذه السلسلة، يحتوي كل كائن JSON على مجموعة من كائنات JSON الأخرى. النية هي استخراج قائمة بالمعرفات حيث تمتلك أي كائن معين خاصية مجموعة تحتوي على كائنات JSON أخرى. نظرت إلى Google's Gson كمكون إضافي JSON محتمل. هل يمكن لأي شخص أن يقدم شكلا من أشكال الإرشادات حول كيفية إنشاء Java من سلسلة JSON هذه؟

هل كانت مفيدة؟

المحلول

نظرت إلى Google's Gson كمكون إضافي JSON محتمل. هل يمكن لأي شخص أن يقدم شكلا من أشكال الإرشادات حول كيفية إنشاء Java من سلسلة JSON هذه؟

جوجل جونس يدعم الأجداد والفاصوليا المتداخلة. ال [] في JSON يمثل مجموعة وينبغي أن الخريطة إلى مجموعة Java مثل List أو مجرد صفيف جافا العادي. ال {} في JSON يمثل كائن وينبغي أن خريطة جافا Map أو مجرد بعض فئة JAVABEAN.

لديك كائن JSON مع العديد من الخصائص التي groups الممتلكات تمثل مجموعة من الكائنات المتداخلة من نفس النوع. يمكن تحليل هذا مع GSON الطريقة التالية:

package com.stackoverflow.q1688099;

import java.util.List;
import com.google.gson.Gson;

public class Test {

    public static void main(String... args) throws Exception {
        String json = 
            "{"
                + "'title': 'Computing and Information systems',"
                + "'id' : 1,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Level one CIS',"
                    + "'id' : 2,"
                    + "'children' : 'true',"
                    + "'groups' : [{"
                        + "'title' : 'Intro To Computing and Internet',"
                        + "'id' : 3,"
                        + "'children': 'false',"
                        + "'groups':[]"
                    + "}]" 
                + "}]"
            + "}";

        // Now do the magic.
        Data data = new Gson().fromJson(json, Data.class);

        // Show it.
        System.out.println(data);
    }

}

class Data {
    private String title;
    private Long id;
    private Boolean children;
    private List<Data> groups;

    public String getTitle() { return title; }
    public Long getId() { return id; }
    public Boolean getChildren() { return children; }
    public List<Data> getGroups() { return groups; }

    public void setTitle(String title) { this.title = title; }
    public void setId(Long id) { this.id = id; }
    public void setChildren(Boolean children) { this.children = children; }
    public void setGroups(List<Data> groups) { this.groups = groups; }

    public String toString() {
        return String.format("title:%s,id:%d,children:%s,groups:%s", title, id, children, groups);
    }
}

بسيطة إلى حد ما، أليس كذلك؟ فقط اجعل جافابيين مناسبين Gson#fromJson().

أنظر أيضا:

نصائح أخرى

Bewaaaaear من Gson! انها رائعة جدا، كبيرة جدا، لكن الثانية التي ترغب في القيام بأي شيء آخر غير الأشياء البسيطة، يمكنك بسهولة أن تحتاج إلى بدء بناء Serializers الخاص بك (والتي ليست كذلك الذي - التي الصعب).

أيضا، إذا كان لديك مجموعة من الكائنات، وأنت تتحلل بعض JSON إلى مجموعة الكائنات، فقدت الأنواع الحقيقية! الكائنات الكاملة لن يتم نسخها! استخدم xStream .. والتي، إذا كنت تستخدم JSondriver وتعيين الإعدادات المناسبة، سترشف أنواعا قبيحة في JSON الفعلية، بحيث لا تفقد أي شيء. سعر صغير لدفع (json القبيح) للاستسلالية الحقيقية.

لاحظ أن جاكسون إصلاح هذه المشكلات، وهي أسرع من غسون.

بشكل غريب، كان معالج JSON اللائق الوحيد الذي ذكر حتى الآن غسون.

فيما يلي خيارات جيدة:

  • جاكسون (جيثب) - ملزمة بيانات قوية (JSON TO / POJOS)، البث (فائق السرعة)، نموذج شجرة (مناسب للوصول غير المصمم)
  • Flex-json. - تسلسل قابل للتكوين للغاية

تحرير (أغسطس / 2013):

واحد أكثر للنظر:

  • جنسون - وظيفة مماثلة لجاكسون، تهدف إلى أن تكون أسهل في تكوين المطور

أو مع جاكسون:

String json = "...
ObjectMapper m = new ObjectMapper();
Set<Product> products = m.readValue(json, new TypeReference<Set<Product>>() {});

إذا، بأي تغيير، فأنت في تطبيق يستخدم بالفعل http://restfb.com/ ثم يمكنك القيام به:

import com.restfb.json.JsonObject;

...

JsonObject json = new JsonObject(jsonString);
json.get("title");

إلخ.

إذا كنت تستخدم أي نوع من الخرائط الخاصة مع مفاتيح أو قيم أيضا من الخرائط الخاصة، فستجد أنه لا ينطبق عن طريق تنفيذ Google.

سهل ويعمل رمز جافا لتحويل JSONObject ل Java Object

الموظف java.

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Generated;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"id",
"firstName",
"lastName"
})
public class Employee {

@JsonProperty("id")
private Integer id;
@JsonProperty("firstName")
private String firstName;
@JsonProperty("lastName")
private String lastName;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
*
* @return
* The id
*/
@JsonProperty("id")
public Integer getId() {
return id;
}

/**
*
* @param id
* The id
*/
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}

/**
*
* @return
* The firstName
*/
@JsonProperty("firstName")
public String getFirstName() {
return firstName;
}

/**
*
* @param firstName
* The firstName
*/
@JsonProperty("firstName")
public void setFirstName(String firstName) {
this.firstName = firstName;
}

/**
*
* @return
* The lastName
*/
@JsonProperty("lastName")
public String getLastName() {
return lastName;
}

/**
*
* @param lastName
* The lastName
*/
@JsonProperty("lastName")
public void setLastName(String lastName) {
this.lastName = lastName;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

loadfromjson.java.

import org.codehaus.jettison.json.JSONObject;

import com.fasterxml.jackson.databind.ObjectMapper;

public class LoadFromJSON {

    public static void main(String args[]) throws Exception {
        JSONObject json = new JSONObject();
        json.put("id", 2);
        json.put("firstName", "hello");
        json.put("lastName", "world");

        byte[] jsonData = json.toString().getBytes();

        ObjectMapper mapper = new ObjectMapper();
        Employee employee = mapper.readValue(jsonData, Employee.class);

        System.out.print(employee.getLastName());

    }
}
HashMap keyArrayList = new HashMap();
Iterator itr = yourJson.keys();
while (itr.hasNext())
{
    String key = (String) itr.next();
    keyArrayList.put(key, yourJson.get(key).toString());
}

ما هو الخطأ في الاشياء القياسية؟

JSONObject jsonObject = new JSONObject(someJsonString);
JSONArray jsonArray = jsonObject.getJSONArray("someJsonArray");
String value = jsonArray.optJSONObject(i).getString("someJsonValue");

إعطاء نعمة محاولة:

https://github.com/richardhightower/boon.

فالشراء بسرعة:

https://github.com/richardhightower/json-parsers-benchmark.

لا تأخذ كلامي لذلك ... تحقق من معيار جاتلينج.

https://github.com/gatling/json-parsers-benchmark.

(ما يصل إلى 4X هو بعض الحالات، والخروج من 100s من الاختبار. كما أنه يحتوي أيضا على وضع تراكب فهرس أسرع. هذا صغير ولكن لديه بالفعل بعض المستخدمين.)

يمكن أن تحليل JSON إلى الخرائط والقوائم بشكل أسرع من أي LIB يمكن أن تحليلها إلى JSON DOM وهذا بدون وضع تراكب فهرس. مع وضع تراكب مؤشر BOON، إنه أسرع.

يحتوي أيضا على وضع JSON LAX سريع للغاية ووضع محلل معي. :) (ولديها ذاكرة منخفضة للغاية، مباشرة من وضع البايتات مع ترميز UTF-8 على الطاير).

كما أن لديها أسرع JSON إلى وضع Javabean أيضا.

إنه جديد، ولكن إذا كانت السرعة و API البسيطة هي ما تبحث عنه، فلا أعتقد أن هناك واجهة برمجة تطبيقية أسرع أو أكثر.

اعتمادا على تنسيق INPUT JSON (سلسلة / ملف) إنشاء JSronstring. يمكن الحصول على عينة كائن فئة الرسائل المقابلة ل JSON على النحو التالي:

رسالة Msgfromjson = ObjectMapper جديد (). ReadValue (Jsonstring، message.class)؛

الطريقة الأسهل هي أنه يمكنك استخدام طريقة SoftConvertValue هذه وهي طريقة مخصصة يمكنك من خلالها تحويل JSondata إلى فئة DTO الخاصة بك المحددة.

Dto response = softConvertValue(jsonData, Dto.class);


public static <T> T softConvertValue(Object fromValue, Class<T> toValueType) 
{
    ObjectMapper objMapper = new ObjectMapper();
    return objMapper
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .convertValue(fromValue, toValueType);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top