Java nesnelerini Jackson ile JSON'a dönüştürme


166

JSON'umun şöyle görünmesini istiyorum:

{
    "information": [{
        "timestamp": "xxxx",
        "feature": "xxxx",
        "ean": 1234,
        "data": "xxxx"
    }, {
        "timestamp": "yyy",
        "feature": "yyy",
        "ean": 12345,
        "data": "yyy"
    }]
}

Kod şimdiye kadar:

import java.util.List;

public class ValueData {

    private List<ValueItems> information;

    public ValueData(){

    }

    public List<ValueItems> getInformation() {
        return information;
    }

    public void setInformation(List<ValueItems> information) {
        this.information = information;
    }

    @Override
    public String toString() {
        return String.format("{information:%s}", information);
    }

}

ve

public class ValueItems {

    private String timestamp;
    private String feature;
    private int ean;
    private String data;


    public ValueItems(){

    }

    public ValueItems(String timestamp, String feature, int ean, String data){
        this.timestamp = timestamp;
        this.feature = feature;
        this.ean = ean;
        this.data = data;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getFeature() {
        return feature;
    }

    public void setFeature(String feature) {
        this.feature = feature;
    }

    public int getEan() {
        return ean;
    }

    public void setEan(int ean) {
        this.ean = ean;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return String.format("{timestamp:%s,feature:%s,ean:%s,data:%s}", timestamp, feature, ean, data);
    }
}

Nasıl Java nesnesini Jackson ile JSON dönüştürmek nasıl parçası eksik:

public static void main(String[] args) {
   // CONVERT THE JAVA OBJECT TO JSON HERE
    System.out.println(json);
}

Sorum şu: Sınıflarım doğru mu? Hangi örneği çağırmam gerekiyor ve bu JSON çıktısını nasıl elde edebilirim?



Teşekkürler bana yardımcı oldu :)
JustTheAverageGirl

eğer varlık diğer tablolara katılmışsa bu yolu takip edin
Sedat Y

Yanıtlar:


417

objectJSON içinde Jackson ile dönüştürmek için :

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);

9
Tek şey String ObjectWriter'dan kaçtı. Kullanın: RESTful gibi Web Hizmetleri üzerinden gönderiliyorsa yeni JSONObject (ow.writeValueAsString (msg)).
15:28

İlgi alanı dışında neden os.writeValueAsJSONString (object) değil?
DevilCode

3
Bu hatayla karşılaşıyorum, kodunuzla nasıl çözüleceğini sınıf com.liveprocessor.LPClient.LPTransaction için hiçbir serileştirici bulunamadı ve BeanSerializer oluşturmak için keşfedilen özellik yok (istisnadan kaçınmak için SerializationFeature.FAIL_ON_EMPTY_BEANS)

11
bu arada kütüphaneler: import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter;
diego matos - keke

objectJSON'unuzun içermesini istediğiniz tüm alanlar için alıcılara sahip OLMALIDIR.
Drakonoved

25

Bunun eski olduğunu biliyorum (ve java için yeniyim), ama aynı problemle karşılaştım. Ve cevaplar bana bir acemi kadar net değildi ... bu yüzden öğrendiklerimi ekleyeceğimi düşündüm.

Çabaya yardımcı olmak için üçüncü taraf bir kütüphane kullandım: Bunun için org.codehaus.jackson tüm indirmeler burada bulunabilir .

Temel JSON işlevselliği için, projenizin kitaplıklarına aşağıdaki kavanozları eklemeniz gerekir: jackson-mapper-asl ve jackson-core-asl

Projenizin ihtiyaç duyduğu sürümü seçin. (Genellikle en son kararlı yapı ile gidebilirsiniz).

Projenizin kitaplıklarına aktarıldıktan sonra importkodunuza aşağıdaki satırları ekleyin :

 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.codehaus.jackson.map.ObjectMapper;

JSON'a dönüştürmek ve RESTful web hizmetinin bir parçası olarak dönmek istediğiniz java nesnesi tanımlanmış ve atanmış değerler ile

User u = new User();
u.firstName = "Sample";
u.lastName = "User";
u.email = "sampleU@example.com";

ObjectMapper mapper = new ObjectMapper();

try {
    // convert user object to json string and return it 
    return mapper.writeValueAsString(u);
}
catch (JsonGenerationException | JsonMappingException  e) {
    // catch various errors
    e.printStackTrace();
}

Sonuç şöyle görünmelidir: {"firstName":"Sample","lastName":"User","email":"sampleU@example.com"}


'Import' satırlarının "import com.fasterxml.jackson.databind.ObjectMapper;" olarak değiştiğine inanıyorum.
barrypicker

16

Bu yararlı olabilir:

objectMapper.writeValue(new File("c:\\employee.json"), employee);

// display to console
Object json = objectMapper.readValue(
     objectMapper.writeValueAsString(employee), Object.class);

System.out.println(objectMapper.writerWithDefaultPrettyPrinter()
     .writeValueAsString(json));

10

sadece bunu yap

 for jackson it's
         ObjectMapper mapper = new ObjectMapper();  
         return mapper.writeValueAsString(object);
         //will return json in string


 for gson it's:
            Gson gson = new Gson();
            return Response.ok(gson.toJson(yourClass)).build();

Response.ok nedir?
Codeversed

MonsonDB içine yerleştirilen JSON boyutları ile ilgili bir sorunum vardı, Gson nesnesini açtığımda Jackson'dan daha büyük boyuta sahipken, izin verilen sınırın üzerindeydim. Sadece bir ipucu.
Daniela Morais

14
Soru jackson, değilGson
Ean V

2
@Codeversed Response, Jersey kütüphanesindeki bir sınıftır. Response.ok, durum kodu 200 ile JSON yanıtını döndürür.
Pranav


2

Kabul edilen cevap bile op'un istediklerini tam olarak vermez . JSON dizesini çıktılar, ancak "karakterlerden kaçtı. Bu yüzden, biraz geç de olsa insanlara yardımcı olacağını umuyorum! İşte nasıl yaparım:

StringWriter writer = new StringWriter();
JsonGenerator jgen = new JsonFactory().createGenerator(writer);
jgen.setCodec(new ObjectMapper());
jgen.writeObject(object);
jgen.close();
System.out.println(writer.toString());

2

Not: olmak zorunda POJO niteliklerini en olarak çözüm çalışması için publicveya bir halkı var getter/ setter:

Varsayılan olarak, Jackson 2 yalnızca herkese açık olan veya herkese açık bir alıcı yöntemine sahip alanlarla çalışır - tüm alanları özel veya paket özel olan bir varlığı serileştirmek başarısız olur.

Henüz test edilmedi, ancak bu kuralın google Gson gibi diğer JSON kütüphaneleri için de geçerli olduğuna inanıyorum.


0
public class JSONConvector {

    public static String toJSON(Object object) throws JSONException, IllegalAccessException {
        String str = "";
        Class c = object.getClass();
        JSONObject jsonObject = new JSONObject();
        for (Field field : c.getDeclaredFields()) {
            field.setAccessible(true);
            String name = field.getName();
            String value = String.valueOf(field.get(object));
            jsonObject.put(name, value);
        }
        System.out.println(jsonObject.toString());
        return jsonObject.toString();
    }


    public static String toJSON(List list ) throws JSONException, IllegalAccessException {
        JSONArray jsonArray = new JSONArray();
        for (Object i : list) {
            String jstr = toJSON(i);
            JSONObject jsonObject = new JSONObject(jstr);
            jsonArray.put(jsonArray);
        }
        return jsonArray.toString();
    }
}

Çok fazla iş, çok fazla yansıma! Haritacıların bu büyük levhaları yapmanıza izin vermemesi gerekiyor!
Ean V

3
Konvektörleri seviyorum!
Christos

0

Google Gson'u bu şekilde kullanabilirsiniz

UserEntity user = new UserEntity();
user.setUserName("UserName");
user.setUserAge(18);

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.