簡體   English   中英

有沒有辦法從json響應創建bean類

[英]Is there a way to create the bean class from a json response

將JSON轉換為Java

上述問題是參考上述線程中描述的內容。 有太多的API可以靈活地以XML或JSON形式返回響應。 **我想知道是否有一種方法可以自動構造對應於JSON響應的java bean。 **

讓我們說你得到一個像這樣的對象

    [
        {
        "name":"Java 6 Greatest Hits",
        "Author":"Jim Bob Jones",
        "price":10.25
        },
        {
        "name":"How to raise a goat",
        "Author":"Sir Paxton",
        "price":55.97   
        },
        {
        "name":"Snow - It is cold",
        "Author":"Dr. White",
        "price":9.99    
        }
   ]

你想要一個類似的課程

public class Book{
    private String author;
    private String name;
    private Number price
}

getter和setter一個選項是使用像JSONGen這樣的服務,它將創建該類。 首先 ,您需要使用它,並在項目中包含生成的代碼。 另一種選擇可能是動態生成使用了Javassist或CGLIB的類,但除非你使用反射來訪問它的成員,因此,即使這是一個類,它會一個真正討厭地圖該類將是無用的。 使用JSONObject絕不會更好

似乎一個簡單的消息類型實體不符合您的要求?

如果你想將json轉換為現有的已知java bean類,

許多lib都可以這樣做,比如

http://json-lib.sourceforge.net/apidocs/net/sf/json/class-use/JSONObject.html

 JSONObject.toBean(JSONObject jsonObject, Class beanClass)
      Creates a bean from a JSONObject, with a specific target class.

順便說一句,如果你正在與restful webservice進行通信,org.springframework.web.client.RestTemplate將幫助你獲得直接bean結果而不是json。

如果類不存在,則需要使用java反射機制的程序。 嘗試使用CGLIB, http: //cglib.sourceforge.net/,動態創建類似BeanMap的類。 我寫了一個簡單的示例,但是要潔具,操作類字節很難,你可能會遇到JVM的奇怪問題。 強烈不鼓勵這樣做。

  public static BeanMap generateBean(JSONObject json) {
    BeanGenerator generator = new BeanGenerator();

    Iterator keys = json.keys();

    while (keys.hasNext()) {
        Object key = keys.next();
        Object value = json.get(key);
        Class keyClass = guessValueClass(value);
        generator.addProperty(key.toString(), keyClass);

    }

    Object result = generator.create();
    BeanMap bean = BeanMap.create(result);
    keys = json.keys();

    while (keys.hasNext()) {
        Object key = keys.next();
        Object value = json.get(key);
        bean.put(key, value);
    }

    return bean;
}

/**
 * TODO fix guess
 */
static Class guessValueClass(Object value) {

    try {
        Integer.parseInt(value.toString());
        return Integer.class;
    } catch (NumberFormatException e1) {

    }
    try {
        Double.parseDouble(value.toString());
        return Double.class;
    } catch (NumberFormatException e1) {

    }
    return String.class;
}

我認為這里的主要問題是JSON響應缺少類型信息 ,上次我在Java中檢查:-)你需要聲明類屬性的類型。 因此,需要一些啟發式來推斷JSON響應中值的類型。

有關SO中的相關問題,請參閱: 從JSON生成Java類?

如果你想從JSON生成Java類,也許你可以試試Jackson 它提供了許多與JSON相關的功能,包括從任意JSON生成字節碼的能力。 有關詳細信息,請參閱此博文

如果您正在使用傑克遜(那里最受歡迎的圖書館),請嘗試

https://bitbucket.org/astav/jsontojava/wiki/Home

它的開源和任何人都應該能夠貢獻。

摘要

JsonToJava源類文件生成器,它根據提供的示例json數據推斷模式,並生成必要的Java數據結構。

在編寫實際代碼之前,它鼓勵團隊先在Json中思考。

特征

可以為任意復雜的層次結構生成類(遞歸)可以讀取現有的Java類,如果它可以反序列化到這些結構中,將會這樣做當存在模糊情況時將提示用戶輸入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM