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

Опитвам се да напиша проста функция, която преобразува Json низове в обекти.

Езикът, който използвам, е обективен, но този въпрос обсъжда проблеми, които не са свързани с този език.

Въпросът ми е, как да разбера типа на обектите, които са положени в 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