java - Gson错误: JsonSyntaxException when Json has a map

标签 java json scala

我正在读取一个 Json 字符串并使用 scala 代码将其转换为一个对象:

val myInstance = (new Gson()).fromJson(t, classOf[myClass])

一切正常,直到我在“myClass”类中添加了 HashMap 。然后对于下面的Json输入(friends是一个hashMap)

{"pId":"P:12345","name":"Dan Brown","friends":{"{\"firstname\":\"John\",\"lastname\":\"Smith\"}":1.0}}

然后我在“firstname”属性处收到以下错误,如下所示。有人有什么主意吗?非常感谢!

15/07/29 08:43:05 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 51
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:186)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)

这是 myClass 类:

public final class myClass extends implements Serializable {

    private static final long serialVersionUID = 11271827L;

    private String pId;
    private String name;
    private List<MyPet> pets = new ArrayList<MyPet>();
    private Map<MyName, Double> friends = new HashMap<MyName, Double>();
       :
   //some getter/setter here
}

这是 myName 类:

public class MyName {

    private String firstname;
    private String lastname;

    /**
     * 
     * @return the Json string
     */
    public final String toJsonString() {
        return (new Gson()).toJson(this);
    }

    @Override
    public final String toString() {
        return toJsonString();
    }
}

最佳答案

在json中,map的key应该是字符串。在您的情况下,您使用 MyName 作为 key 。所以 json 解析器使用 MyName#toString() 转换为字符串。

我的建议是正确的 MyName#toString() 实现,并在 MyName 类中提供静态方法 MyName valueOf(String)

例如:

class MyName{
    private String firstName;
    private String lastName;

    // getters and setters

    @Override
    public String toString(){
        return firstName+" "+lastName;
    }

    public static MyName valueOf(String str){
        int space = str.lastIndexOf(' ');
        if(space==-1)
            throw new IllegalArgumentException();
        MyName myName = new MyName();
        myName.setFirstName(str.subString(0, space));
        myName.setLastName(str.subString(space+1));
        return myName;
    }
}

此处 valueOftoString 实现应该兼容。

上面的代码假设lastName中没有空格

关于java - Gson错误: JsonSyntaxException when Json has a map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705526/

相关文章:

c# - 如何将匿名 json 作为类成员并将所有转换为 c# 中的 json

json - 编码结构 slice 时向生成的 JSON 添加外部标记

scala - 具有抽象类型成员的具体类

json - Play Framework 自动 JSON 编码

java - 在月份下拉列表中选择值 - Selenium Webdriver

java - 为 Java 程序创建 Windows 安装程序

java - Google 应用引擎拒绝 https 证书

java - 读取java进程的输入流

json - 多个Json条目到一个结构

scala - 如何从标准输入获取 Actor 信息?