使用GSON将JSON字符串转换为Java对象

使用GSON将JSON字符串转换为Java对象,java,json,parsing,gson,Java,Json,Parsing,Gson,我正在尝试将json解析为java 根据jsonlint.com,我有以下有效的json字符串 private final static String LOC_JSON = "[" +"{" +" \"lat1\": 39.737567," +" \"lat2\": 32.7801399," +" \"long1\": -104.98471790000002," +" \"long2\":

我正在尝试将json解析为java

根据jsonlint.com,我有以下有效的json字符串

private final static String LOC_JSON = 
         "["
        +"{"
        +"  \"lat1\": 39.737567,"
        +"  \"lat2\": 32.7801399,"
        +"  \"long1\": -104.98471790000002,"
        +"  \"long2\": -96.80045109999998"
        +"},"
        +"  ["
        +"      {"
        +"          \"lat\": {"
        +"              \"b\": 38.88368709500021,"
        +"              \"d\": 40.620468491667026"
        +"          },"
        +"          \"long\": {"
        +"          \"b\": -105.75306170749764,"
        +"          \"d\": -104.675854661387"
        +"          }"
        +"      }"
        +"  ]"
        +"]";
我试图将其解析为一个对象,但得到了以下错误。 “应为BEGIN_对象,但在第1行第2列为BEGIN_数组”

BoxSearch由以下部分组成

private Number lat1;
private Number lat2;
private Number long1;
private Number long2;
private Boxes[] boxes;
框是定义相同的纬度对象和经度对象

private String b;
private String d;
我可以将更高级别的属性(lat1、lat2、long1和long2)解析为一个更简单的BoxSearch对象,该对象仅具有这4个属性。当json和对象更复杂时,麻烦就来了。甚至可以做我正在尝试的事情吗

我希望我提供了足够的信息来获得帮助。我会很高兴提供更多的信息,甚至一个测试项目,如果需要的话。我将此作为junit测试运行


谢谢。

出现错误的原因是顶级JSON是数组,而不是对象。这一点已包括在内

但是,那里的解决方案不适用于JSON,因为您有一个混合类型的数组(一个对象和一个数组),而不是一个单一类型对象的数组。为此,您必须编写一个自定义反序列化程序(请参阅),或者直接使用Gson的类并从解析树中提取数据

根据上面的评论编辑:

如果您是创建JSON的人,那么您想要的似乎是一个
BoxSearch
对象数组

基于Java
BoxSearch
类,您需要JSON的结构如下:

[
    {
        "lat1" : 39.737567,
        "lat2" : 32.7801399,
        "long1" : -104.98471790000002,
        "long2" : -96.80045109999998,
        "boxes" : [ 
                    {
                      "lat": {
                          "b": 38.88368709500021,
                          "d": 40.620468491667026
                      },
                      "long": {
                          "b": -105.75306170749764,
                          "d": -104.675854661387
                      }
                    }
                  ]
    }
]
但是,定义
类的方式对此不起作用。(你的意思是要有一个数组吗?)。按原样,它需要如下所示:

class Boxes {
    Box lat;
    @SerializedName("long")
    Box lon;
}

class Box {
   String b;
   String d;
}
现在,您有了一个数组,其中包含一种类型的对象(
BoxSearch
),您可以使用该对象进行反序列化:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType();
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType);

非常简单。

可能的重复-您的JSON是一个数组,而不是一个对象。不过,您将遇到一个问题,因为它是一个包含不同类型对象(对象和数组)的数组,如果不编写自定义deserializer@BrianRoach这更像是一个答案;)@RC。是 啊嗯,我想也许我会移动它,老Q回答了他为什么会出现错误,但他的案例的解决方案是不同的。我确实经历了可能的重复,但这个对象是简单的,而不是复杂的。有没有更好的方法来组织json字符串?我的用户界面(基于谷歌地图)正在组装,但我可以操作它。我想我会尝试更简单/更平坦的对象。还是编写自定义反序列化程序才是正确的选择?@user2415153-请参阅下面我的扩展答案。如果您是生成JSON的人,那么是的——重新生成JSON使其成为对象而不是数组将使您的生活更加轻松。让我在我的回答中进一步阐述一下这一点;编辑。非常感谢Brian,对json做了一些小小的调整,一切都很好。我会投票支持这个答案,但我没有“街头信誉”。代码像冠军一样工作。如果有人复制并粘贴此答案,框长;需要重命名:-)哦,是的,我需要数组。再次感谢。@user2415153我更改了代码,以便它可以与JSON中的
“long”
一起使用-请立即查看答案:)我没有注意到,抱歉。至于投票,你可以接受我的答案;)很高兴我能帮忙!别出心裁的解决办法!我刚刚将变量重命名为完整单词。接受回答!再次感谢!它帮助我转换一个包含列表的json对象。我将json字符串转换为Object.class
Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType();
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType);
gson.fromJson(json, BoxSearch.class);
Gson gson = new Gson();
gson.fromJson(jsonStr,YourClass.class);