Java 使用Gson解析没有键的嵌套JSON对象

Java 使用Gson解析没有键的嵌套JSON对象,java,android,json,parsing,gson,Java,Android,Json,Parsing,Gson,我有一个包含以下内容的JSON: [ { "lines" : { "0" : "Hammersmith & City", "1" : "Circle" }, "id" : "233", "name" : "Shepherd's Bush Market" }, { "lines" :"", "id" : "233", "name" : "Shepherd's Bush Market" }, {

我有一个包含以下内容的JSON:

[ {
    "lines" : {
        "0" : "Hammersmith & City",
        "1" : "Circle"
    },
    "id" : "233",
    "name" : "Shepherd's Bush Market"
}, {
    "lines" :"",
    "id" : "233",
    "name" : "Shepherd's Bush Market"
}, {
    "lines" : {
        "0" : "Hammersmith & City",
        "1" : "Circle"
    },
    "id" : "233",
    "name" : "Shepherd's Bush Market"
},
, {
    "lines" : "",
    "id" : "233",
    "name" : "Shepherd's Bush Market"
  }]
通常,我可以创建这样的对象

public class MyObject {

    public String id;  
    public String name;
    public Line[] lines;

    public class Line {
        public String key;
        public String value;
    }
}
Gson序列化程序将处理解析,但在本例中,
没有任何键/id。我尝试过使用
HashMaps
Maps
而不是内部类,但它不起作用。有没有一种方法可以用Gson解析这个

更新:

我已经将
MyObject
更改为
Map
,并在JSON响应中添加了更多行

目前,这是我用来解析JSON的代码

Type listType = new TypeToken<List<MyObject>>(){}.getType();
List<MyObject> data = getGson().fromJson(str, listType);

Caused by: com.google.gson.JsonParseException: The JsonDeserializer MapTypeAdapter    failed to deserialize json object "" given the type java.util.Map<java.lang.String, java.lang.String>
Type listType=new-TypeToken(){}.getType();
List data=getGson().fromJson(str,listType);
原因:com.google.gson.JsonParseException:给定类型java.util.Map,JsonDeserializer MapTypeAdapter无法反序列化json对象“”
查看整个JSON响应后,似乎
在不可用时返回为空的
字符串
(“”),在可用时返回为映射。我认为这可能是问题的一部分

使用
Map
代替
Line[/Line

(您不需要class

它应该会起作用

或者如果您的键是整数
Map
也可以使用

[编辑]

json字符串表示对象列表:
{..}、{..}、{..}

您需要用
[]
包装它

因此,工作json应该是:

[
    {
        "lines": {
            "0": "Hammersmith & City",
            "1": "Circle"
        },
        "id": "233",
        "name": "Shepherd's Bush Market"
    },
    {
        "lines": {
            "0": "Hammersmith & City",
            "1": "Circle"
        },
        "id": "233",
        "name": "Shepherd's Bush Market"
    },
    {
        "lines": {
            "0": "Hammersmith & City",
            "1": "Circle"
        },
        "id": "233",
        "name": "Shepherd's Bush Market"
    }
]
MyObject

public class MyObject {
 public String id;

 public String name;

 public Map<String,String> lines;   
}

在循环中,您可以提取
Map
以及我喜欢Maxim的解决方案,因为它简单,而他喜欢+1。但是还有其他更复杂的方法。在
类中,您可以将键写为
\u 0
\u 1

class Lines {
    private String _0;
    private String _1;
    //@Override
    //public String toString() {
    //    return "Lines [0=" + _0 + ", 1=" + _1 + "]";
    //}

}
并在
MyObject
like中使用它

class MyObject {

    private Lines lines;
    private String id;
    private String name;

    //@Override
    //public String toString() {
    //    return "Example [lines=" + lines + ", id=" + id + ", name=" + name + "]";
    //}
}
之后,您必须创建
字段命名策略
,该策略将从数字键中删除

class MyNameStrategy implements FieldNamingStrategy {

    static Pattern numericPattern = Pattern.compile("_\\d+");

    @Override
    public String translateName(Field f) {
        if (numericPattern.matcher(f.getName()).matches()){
            return f.getName().substring(1);
        }else{
            return f.getName();
        }
    }
}
要使用此策略,您需要通过
GsonBuilder

Gson gson = new GsonBuilder().setFieldNamingStrategy(
        new MyNameStrategy()).create();
//...
MyObject[] arr = gson.fromJson(jsonString, MyObject[].class);
System.out.println(Arrays.toString(arr));

您的JSon在
“行”:“
”中有问题也是对的。由于您将
对象
(数据位于
{…}
)中,因此以后无法将格式更改为
字符串
(该字符串不是JSon格式的对象)。
因此,如果您可以更改JSon,则应将
“行”:“
替换为

  • “行”:空
  • “行”:{}

我像这样试过公共地图线;但是我的应用程序崩溃了,出现了以下异常09-27 19:31:38.636:E/AndroidRuntime(17729):原因:com.google.gson.JsonParseException:JsonDeserializer MapTypeAdapter未能反序列化json对象“”,因为在提取
行之前,给定了java.util.Map类型。它很容易抓住是的,我也在做同样的事情,我似乎已经发现了问题所在。有时,如果行没有值,它将作为字符串“”返回,当有值时,它将作为映射对象返回。我并不真正理解此策略,数字0、1等不是键,因此它们可以继续到20。当返回的值为“@user2611073”时,可能会发生崩溃。您可以显示用于解析json的代码吗?发布的json字符串也是json数组的唯一片段吗?如果没有,您可能需要用
[
]
包围json字符串,因为(如果我没有弄错的话)解析json字符串必须是一个对象或对象数组。@user2611073我用其他信息更新了我的答案,并稍微更改了以前的代码。
class MyNameStrategy implements FieldNamingStrategy {

    static Pattern numericPattern = Pattern.compile("_\\d+");

    @Override
    public String translateName(Field f) {
        if (numericPattern.matcher(f.getName()).matches()){
            return f.getName().substring(1);
        }else{
            return f.getName();
        }
    }
}
Gson gson = new GsonBuilder().setFieldNamingStrategy(
        new MyNameStrategy()).create();
//...
MyObject[] arr = gson.fromJson(jsonString, MyObject[].class);
System.out.println(Arrays.toString(arr));