Тип объектов внутри непараметризованных массивов в JSON

Я пытаюсь написать простую функцию, которая преобразует строки Json в объекты.

Я использую язык Objective-C, однако в этом вопросе обсуждаются вопросы, не относящиеся к этому языку.

Мой вопрос: как узнать тип объектов, лежащих внутри массива json, которые должны быть сопоставлены с непараметризованными (также известными как необобщенные) списками??

Я обнаружил, что две библиотеки Json Java не могут решить эту проблему, Jakson и Gson, и вот пример:

import java.io.Serializable;
import java.util.List;

import com.google.gson.Gson;


public class Main
{
    public static void main(String[] args) throws Exception
    {
        Gson g = new Gson();
        Office o =  g.fromJson(
                "{\"empx\":\"1\",\"emps\":[{\"firstName\":\"Muhammad\",\"lastName\":\"Abdullah\"},{\"firstName\":\"XX\",\"lastName\":null}]}"
                , Office.class);
        System.out.println(((Employee)o.getEmps().get(0)).getFirstName());
    }
}

class Office
{
    private List emps;
    private String empx;

    public String getEmpx()
    {
        return empx;
    }
    public void setEmpx(String empx)
    {
        this.empx = empx;
    }

    public List getEmps()
    {
        return emps;
    }

    public void setEmps(List emps)
    {
        this.emps = emps;
    }
}


class Employee implements Serializable
{
    private static final long serialVersionUID = 1L;
    String firstName;
    String lastName;

    public String getFirstName()
    {
        return firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }
}

В Google Gson они считали объекты этого массива объектами типа java.lang.Object:

Exception in thread "main" java.lang.ClassCastException: java.lang.Object

Но Jaskon был намного умнее, он считал этот unknown объект Картой:

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap

Однако обоим не удалось обнаружить Объект (что, я думаю, невозможно!)

Итак, в языке, который не поддерживает параметризованные типы (Generics), нет ли способа сделать это?


person Muhammad Hewedy    schedule 26.09.2011    source источник
comment
Конечно, он никак не может обнаружить, что вы хотите создать объект Employee: нет никакой ссылки на Employee вообще! И вообще непонятно, что вы тут спрашиваете.   -  person Daniel Brockman    schedule 27.09.2011
comment
Что касается Гсона, Джексона, определить тип невозможно, но для этого требуется либо включение информации о типе (полиморфная (де)серилизация), либо указание типа в вашем вызове. Оба могут сделать последнее, Джексон, по крайней мере, может сделать первое.   -  person StaxMan    schedule 28.09.2011


Ответы (1)


Я бы посоветовал использовать словари. Ключевые ключи могут выводить типы или может быть ключ типа.

person zaph    schedule 26.09.2011