首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在反序列化JSON时,RuntimeTypeAdapterFactory 'typeFieldName‘上应该包含哪些字符串?

在反序列化JSON时,RuntimeTypeAdapterFactory 'typeFieldName‘上应该包含哪些字符串?
EN

Stack Overflow用户
提问于 2020-02-06 21:51:09
回答 1查看 31关注 0票数 0

我试图反序列化这个JSON:

代码语言:javascript
复制
{
  "locations":
  [
    {
      "name": "Sagrada Família",
      "coordinates": [2.174400, 41.403475],
      "description": "Famosa església inacabada iniciada la dècada de 1880, amb un museu i vistes de la ciutat.",
      "architect": "Antoni Gaudí i Cornet",
      "inauguration": 2026
    },
    {
      "name": "Plaça Catalunya",
      "coordinates": [2.170079, 41.386878],
      "description": "La plaça de Catalunya és la més cèntrica i gran de les places de Barcelona. Constitueix el punt d'unió \nentre el nucli antic de la ciutat i l'Eixample. D'aquí parteixen importants vies de la ciutat com la Rambla, \nel passeig de Gràcia, la rambla de Catalunya, les rondes de la Universitat i de Sant Pere i el carrer Pelai, \nigual com l'avinguda del Portal de l'Àngel, la gran artèria comercial de la ciutat, i antiga porta de \nles muralles."
    },
    {
      "name": "Can Punyetes",
      "coordinates": [2.159704, 41.398694],
      "description": "Restaurant de cuina catalana.",
      "characteristics": ["Acollidor", "Informal", "Està bé per als nens"]
    },
    {
      "name": "Traphouse",
      "coordinates": [2.165150, 41.405290],
      "description": "Casa reconeguda principalment per les cançons que es composen aquí. Els veïns són una delícia, \nmai es queixen del xivarri que hi ha."
    },
    {
      "name": "Lloc de Socis",
      "coordinates": [2.166506, 41.402617],
      "description": "Si alguna vegada vols ser soci d'un club on la gent s'ho passa molt bé, aquest és el lloc \non has d'anar. No te'n penediràs!"
    },
    {
      "name": "Adoquín Square",
      "coordinates": [2.172804, 41.388794],
      "description": "Plaça coneguda pels jocs lúdics que s'organitzen. Es poden fer des de partides de Minecraft fins al \njoc de la manguera d'aigua. També s'ofereix servei de barbacoa."
    },
{
      "name":"Hotel W",
      "coordinates": [2.190109, 41.368762],
      "description": "Hotel més famós de Barcelona definit per la seva forma de vela. A dins t'hi pots trobar de tot\n menys Barcelonins. Ha estat galardonat amb el premi per més mites per metre quadrat de la ciutat, \nprecedit per La Salle Campus Barcelona",
      "stars": 5
    }
  ]
}

JSON由一个对象Location数组组成,但我也希望将数据存储在Location的子类中。这是所有的课程:

代码语言:javascript
复制
public class Location {

    private String name;
    private double[] coordinates;
    private String description;
}

public class Hotel extends Location {

    private short stars;
}

public class Monument extends Location {

    private String architect;
    private short inauguration;
}

public class Restaurant extends Location {

    private String[] characteristics;
}

public class DataModel {      //Class that will contain the JSON data

    private Location[] locations;
}

为了反序列化这个多态JSON,我执行以下操作:

代码语言:javascript
复制
try {
            RuntimeTypeAdapterFactory<Location> runtimeTypeAdapterFactory = RuntimeTypeAdapterFactory
                                                                    .of(Location.class, "type")
                                                                    .registerSubtype(Hotel.class)
                                                                    .registerSubtype(Monument.class)
                                                                    .registerSubtype(Restaurant.class);
            Gson gson = new GsonBuilder().registerTypeAdapterFactory(runtimeTypeAdapterFactory).create();
            JsonReader reader = new JsonReader(new FileReader(path));
            dataModel = gson.fromJson(reader, DataModel.class);
            int i= 0;

        } catch(FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Error");
        }

但我得到的输出是:

线程"main“com.google.gson.JsonParseException中的异常:无法反序列化类models.Location,因为它没有定义名为类型的字段

我还尝试将标签"type“更改为"locations”,如JSON中所示,但没有成功。有什么不对的吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-02-07 11:21:56

根据文档 of RuntimeTypeAdapterFactory

通过将基类型和类型字段名传递给{@link #of}工厂方法,创建{@代码RuntimeTypeAdapterFactory}。如果不提供显式类型字段名,则将使用{@代码" type "}。

json的每个元素都应该有一个字段来表示该元素的类名。

比如,

代码语言:javascript
复制
    {
      "name": "Adoquín Square",
      "coordinates": [
        2.172804,
        41.388794
      ],
      "description": "Plaça coneguda pels jocs lúdics que s'organitzen. Es poden fer des de partides de Minecraft fins al \njoc de la manguera d'aigua. També s'ofereix servei de barbacoa.",
      "type": "Location"
    },
    {
      "name": "Hotel W",
      "coordinates": [
        2.190109,
        41.368762
      ],
      "description": "Hotel més famós de Barcelona definit per la seva forma de vela. A dins t'hi pots trobar de tot\n menys Barcelonins. Ha estat galardonat amb el premi per més mites per metre quadrat de la ciutat, \nprecedit per La Salle Campus Barcelona",
      "stars": 5,
      "type": "Hotel"
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60104073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档