मेरे पास एक JSON प्रतिक्रिया है, जो इस तरह दिखती है:

     {
    "equipment_layer": [
        {
            "id": 2,
            "name": "Gateway",
            "detail": "All gateways"
        },
        {
            "id": 3,
            "name": "Node",
            "detail": "All Nodes"
        },
        {
            "id": 1,
            "name": "Miscellaneous",
            "detail": "All miscellaneous assets"
        },
        {
            "id": 4,
            "name": "Sensors",
            "detail": "All Sensors"
        },
        {
            "id": 5,
            "name": "IRM",
            "detail": "Installation required material"
        },
        {
            "id": 6,
            "name": "Communication",
            "detail": "All communication devices such as Cellular Router, ETU etc. which are purely communication"
        }
    ],
    "data": {
        "1": [
            {
                "equipment_id": 353,
                "item_quantity": 1,
                "name": "DC Current Transformer (20mm) (Old)",
                "shortcode": "SNS-DCI-CT20m-R1A",
                "part_number": "718,804,805,",
                "equipment_layer_id": 1,
                "equipment_layer_name": "Miscellaneous"
            },
            {
                "equipment_id": 357,
                "item_quantity": 1,
                "name": "Fuel Sensor - B4 (Old)",
                "shortcode": "SNS-FUL-PSR-R1A",
                "part_number": "718,810,811",
                "equipment_layer_id": 1,
                "equipment_layer_name": "Miscellaneous"
            }
        ],
        "2": [
            {
                "equipment_id": 345,
                "item_quantity": 1,
                "name": "RTU (Old)",
                "shortcode": "RAN-RTU-PMCL-R1A",
                "part_number": "787,788,789",
                "equipment_layer_id": 2,
                "equipment_layer_name": "Gateway"
            }
        ],
        "3": [
            {
                "equipment_id": 356,
                "item_quantity": 1,
                "name": "Battery Analyzer (Product) (Old)",
                "shortcode": "RAN-BAM-PMCL-R1A",
                "part_number": "787,808,809",
                "equipment_layer_id": 3,
                "equipment_layer_name": "Node"
            }
        ],
        "4": [
            {
                "equipment_id": 346,
                "item_quantity": 1,
                "name": "DC Current Transformer (30mm) (Old)",
                "shortcode": "SNS-CT-DCI-R1A",
                "part_number": "718,792,793",
                "equipment_layer_id": 4,
                "equipment_layer_name": "Sensors"
            },
            {
                "equipment_id": 350,
                "item_quantity": 1,
                "name": "AC Block CT (Old)",
                "shortcode": "SNS-ACI-BLK-R1A",
                "part_number": "718,790,791",
                "equipment_layer_id": 4,
                "equipment_layer_name": "Sensors"
            }
        ]
    }
}

अब "डेटा" लेबल के बाद का हिस्सा गतिशील है, एक प्रतिक्रिया में मेरे पास "1", "2" के सबएरे हो सकते हैं, लेकिन "3" या "4" के नहीं। अंदर के डेटा का POJO वैसा ही है जैसा आप देख सकते हैं . तो मैं इस डेटा को कैसे पार्स कर सकता हूं? मैं Gson.converterfactory के साथ Rerofit2 का उपयोग कर रहा हूं। मैंने jsonchema2pojo भी कोशिश की है लेकिन "डेटा" ऑब्जेक्ट के अंदर डेटा दिखाई नहीं दे रहा है।

मैंने इस विधि का पालन करने की कोशिश की है: Gson का उपयोग करके विभिन्न JSON संरचनाओं के साथ Retrofit2 परिणाम पार्स करना लेकिन मैं UnrwapConverter को ट्रिगर नहीं कर सकता। यह मेरा कनवर्टरफैक्टरी कार्यान्वयन है:

    internal class UnwrappingGsonConverterFactory private constructor(private val gson: Gson) : Converter.Factory() {

override fun responseBodyConverter(type: Type, annotations: Array<Annotation>, retrofit: Retrofit): Converter<ResponseBody, *> ?{
    if (!needsUnwrapping(annotations)) {
        return super.responseBodyConverter(type, annotations, retrofit)
    }
    val typeAdapter = gson.getAdapter(TypeToken.get(type))
    return UnwrappingResponseConverter(typeAdapter)
}

private class UnwrappingResponseConverter (private val typeAdapter: TypeAdapter<*>) : Converter<ResponseBody, Any> , AnkoLogger{

    @Throws(IOException::class)
    override fun convert(responseBody: ResponseBody): Any? {
        responseBody.use { responseBody ->
            JsonReader(responseBody.charStream()).use({ jsonReader ->
                // Checking if the JSON document current value is null
                val token = jsonReader.peek()
                if (token === JsonToken.NULL) {
                    return null
                }
                // If it's an object, expect `{`
                jsonReader.beginObject()
                var value: Any? = null
                // And iterate over all properties
                while (jsonReader.hasNext()) {
                    val data = jsonReader.nextName()
                    debug("Unwrap Stuff:  $data")
                    when (data) {
                        "1", "2", "3", "4", "5", "6" -> value = typeAdapter.read(jsonReader)

                        else ->jsonReader.skipValue()
                    }
                }
                // Consume the object end `}`
                jsonReader.endObject()
                return value
            })
        }
    }

}

companion object {

    fun create(gson: Gson): Converter.Factory {
        return UnwrappingGsonConverterFactory(gson)
    }

    private fun needsUnwrapping(annotations: Array<Annotation>): Boolean {
        for (annotation in annotations) {
            if (annotation is Unwrap) {
                return true
            }
        }
        return false
    }
}

 }

और इंटरफ़ेस:

   @Retention(AnnotationRetention.RUNTIME)
   @Target(AnnotationTarget.FUNCTION)
   annotation class Unwrap

मेरे डेटा वर्ग ये हैं:

data class ActivityNodes(@SerializedName("equipment_layer") val equipmentLayer: List<EquipmentLayer>,
                         @SerializedName("data") val data: nodeData)

data class nodeData (@SerializedName("1") val nodeList: List<dataItem>) <-- this is where I need someway to tell SerializedName that the value can be anything from 1 to 6

data class dataItem(@SerializedName("equipment_id") val equipmentId: Int,
                    @SerializedName("item_quantity") val itemQuantity: Int,
                    @SerializedName("name") val name: String,
                    @SerializedName("shortcode") val shortCode: String,
                    @SerializedName("part_number") val partNumber: String,
                    @SerializedName("equipment_layer_id") val equipmentLayerId: Int,
                    @SerializedName("equipment_layer_name") val equipmentLayerName: String,
                    var isScanned: Boolean = false )



data class EquipmentLayer(@SerializedName("id") val id: Int,
                          @SerializedName("name") val name: String,
                          @SerializedName("detail") val details: String)
0
ibraizQ9 22 सितंबर 2017, 15:24

1 उत्तर

सबसे बढ़िया उत्तर

गतिशील JSON के लिए, आपको JSON स्ट्रिंग को मैन्युअल रूप से पार्स करना होगा। JSON स्ट्रिंग को रेट्रोफिट से प्राप्त करने के लिए आपको GsonConverterFactory के बजाय ScalarsConverterFactory का उपयोग करना होगा।

इस निर्भरता को जोड़ें:

compile 'com.squareup.retrofit2:converter-scalars:2.3.0'

एडॉप्टर इस तरह बनाएं:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://echo.jsontest.com")
    .addConverterFactory(ScalarsConverterFactory.create())
    .build()

ResponseBody के साथ अनुरोध विधि बनाएं

public interface MyService {
    @GET("/key/value/one/two")
    Call<ResponseBody> getData();
}

आप इस तरह जेसन स्ट्रिंग प्राप्त कर सकते हैं:

MyService service = retrofit.create(MyService.class);
Call<ResponseBody> result = service.getData();
result.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        e.printStackTrace();
    }
});

अब आपको JSON से अपना डेटा प्राप्त करने के लिए मैन्युअल रूप से JSON स्ट्रिंग को पार्स करना होगा।

आशा है कि इससे सहायता मिलेगी:)

0
Bhuvanesh BS 22 सितंबर 2017, 16:51