2015-01-13 18 views
6

Kullandığım bir REST hizmetinden dönen bu JSON'u kullanıyorum. Scala'da json'u ayrıştırma ve değiştirme

{ 
    "id": "6804", 
    "signatories": [ 
     { 
      "id": "12125", 
      "fields": [ 
       { 
        "type": "standard", 
        "name": "fstname", 
        "value": "John" 
       }, 
       { 
        "type": "standard", 
        "name": "sndname", 
        "value": "Doe" 
       }, 
       { 
        "type": "standard", 
        "name": "email", 
        "value": "[email protected]" 
       }, 
       { 
        "type": "standard", 
        "name": "sigco", 
        "value": "Company" 
       } 
      ] 
     } 
    ] 
} 

Şu anda orada farklı nesnelerin özellik "değer" değiştirmek edebilmek için, "alanlar" dizisi üzerinde yineleme, json4s ile bu ayrıştırmak için bir yol araştırıyorum. Şimdiye kadar birkaç json libs denedim ve json4s ile bitti.

Json4s, json'u "alanlar" dizisini 'dan ayıklayabileceğim bir JObject'e ayrıştırmama izin veriyor.

import org.json4s._ 
    import org.json4s.native.JsonMethods._ 

    // parse to JObject 
    val data = parse(json) 

    // extract the fields into a map 
    val fields = data \ "signatories" \ "fields" 

    // parse back to JSON 
    println(compact(render(fields))) 

Böyle bir harita çıkarmak başardı ve tekrar JSON geri render ettik. Yine de anlayamadığım şey, bu alanlardan nasıl geçilir ve onların içindeki "değeri" nasıl değiştirilir?

json4s belgelerini okudum, ancak hem Scala hem de sözdizimi konusunda çok yeniyim, bu yüzden zor bir zaman geçiriyorum.

Sorun, "value" özelliğini değiştirmek için ayrıştırılmış bir JSON sonucu üzerinde nasıl yineleyebilirim?

İşte elde etmek istediğim akış.

  1. Ayrıştırma JSON iterable nesne
  2. Döngü içine yoluyla ve bazı "adlarıyla" ni bulun ve John başka isme, örneğin fstname için, onların değerini değiştirmek.
  3. JSON'a geri dönün, böylece yeni JSON'u güncel değerlerle geri gönderebilirim.

Bunu yapmanın en iyi yolu olup olmadığını bilmiyorum, gerçekten girişi takdir ediyorum, belki bunu yapmanın daha kolay bir yolu var. peşin

sayesinde Saygılarımızla,

Stefan Konno

Sen yapmanın en kolay şeydir vaka sınıfının bir diziye json dönüştürebilirsiniz
+0

soru nedir kullanabilirim? – Theolodis

+0

"Bu alanlar arasında nasıl dönülür ve özellik" değerini "değiştirir". Soruyu daha iyi ifade etmek için soruyu düzenleyeceğim, üzgünüm. –

+0

Her zaman seri hale getirme nesnesi olmadan \\ operatörünü kullanabilirsiniz. – bkowalikpl

cevap

6

. Örneğin:

case class Field(`type`: String, name: String, value: String) 

gibi Fields için durum sınıf var ve json size alanların bir dizi verecektir

[ 
      { 
       "type": "standard", 
       "name": "fstname", 
       "value": "John" 
      }, 
      ... 
     ] 

nerede olduğunu read[Array[Field]](json) gibi alanlarda dizisi halinde json dönüştürebilirsiniz. Aynı şekilde, tüm Json'unuzu modelleyebilirsiniz.

Şu anda bir dizi vaka sınıfınız var, nesneyi yinelemek ve copy örnek sınıflarını kullanarak değeri değiştirmek oldukça basit.

Bundan sonra, nesne dizisini Json'a dönüştürmek için, write(objects)'u kullanabilirsiniz (Json4'lerin okuma ve yazma işlevleri org.json4s.native.Serialization paketinde bulunmaktadır.

Update 

vaka sınıfa dönüştürmeden bunu yapmak için, transformField işlevini

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))} 
+0

Tamam güzel, deneyeceğim. Planım ilk olarak jsonumu dönüştürmek için bir Case Class kullanmaktı. Yaptığım json sadece REST'den aldığım jsonun bir parçası, bu yüzden 50 alan için bir vaka sınıfı oluşturamadım. Bu yüzden json4s ile json ayrıştırmaya karar verdim. Bunu vaka dersleri oluşturmadan yapabilir miyim? –

+0

Emin değilim. Ancak bir süre sonra deneyeceğim, ancak IMO, daha büyük bir sınıf oluşturmak için büyük sınıflar oluşturmak ve Json4s'i bir json'u yuvalanmış bir vaka sınıfına dönüştürmeyi oldukça kolaylaştırıyor. – mohit

+0

Yanıtı güncelledim – mohit