【问题标题】:Type of objects inside non-parameterized arrays in JSONJSON中非参数化数组中的对象类型
【发布时间】:2011-09-26 20:33:38
【问题描述】:

我正在尝试编写将 Json 字符串转换为对象的简单函数。

我使用的语言是objective-c,但是这个问题讨论的问题与这个语言无关。

我的问题是,如何知道要映射到非参数化(又名非泛型)列表的 json 数组中的对象类型??

我发现两个 Json Java 库无法解决此问题,JaksonGson,示例如下:

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

但是,两者都未能检测到对象(我认为这是不可能的!)

那么,在不支持参数化类型(泛型)的语言中,难道没有办法做到这一点吗?

【问题讨论】:

  • 当然,它无法检测到您希望它创建一个Employee 对象:没有任何对Employee 的引用!目前还不清楚你在这里实际问的是什么。
  • Wrt Gson,Jackson,检测类型并非不可能,但这需要包含类型信息(多态(去)serailziation),或者在您的调用中指定类型。两者都可以做后者,杰克逊至少可以做前者。

标签: java objective-c json generics gson


【解决方案1】:

我建议使用字典。键键可以推断类型或者可能存在类型键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多