当前位置: 首页 > 知识库问答 >
问题:

使用GSONJava对象的JSON字符串

韩欣怿
2023-03-14

我正在尝试将json解析为java。

根据jsonlint,以下字符串是有效的json。com公司

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_OBJECT但BEGIN_ARRAY在第1行第2列"

            Gson gson = new Gson();
        BoxSearch b = gson.fromJson( LOC_JSON, BoxSearch.class ); 

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测试运行。

谢谢

共有2个答案

邬楚青
2023-03-14

错误的原因是您在顶层的JSON是一个数组,而不是一个对象。这被GSON抛出的“预期BEGIN_OBJECT但被BEGIN_ARRAY”所覆盖?。

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

从上面的评论中编辑:

如果您是创建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
                      }
                    }
                  ]
    }
]

但是,您定义Box类的方式不适用于此。(您的意思是拥有它们的数组吗?)。原样它需要看起来像:

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);

如果确实不需要这些数组,请去掉外部数组,只需执行以下操作:

gson.fromJson(json, BoxSearch.class);

尚声
2023-03-14
Gson gson = new Gson();
gson.fromJson(jsonStr,YourClass.class);

非常简单。

 类似资料:
  • 我正在使用com。谷歌。格森。Gson将JSON字符串转换为Java对象的API: 我想知道javax.jsonapi中是否有等效的API来执行等效操作。谢谢!

  • 我想使用字符串创建一个JSON对象。 示例:JSON 为了创建上面的JSON,我使用了这个。 我想知道如何创建一个包含JSON数组的JSON。 下面是示例JSON。 多谢了。

  • 问题内容: 我正在使用。我想转换为Json 。 没用 为什么? 问题答案: 试试这个:

  • 问题内容: 尝试解析最小值以在Android中映射时出现问题。 有一些示例JSON格式,其中包含更多信息,例如: 该示例最常使用且易于使用,仅使用或即可。 但是,我该如何解析仅使用字符串和值最小格式的这种JSON格式映射到使用循环的Java地图集合。而且因为字符串json总是会彼此不同。例如: 谢谢 问题答案: 您需要获取所有键的列表,对其进行循环,然后将它们添加到地图中,如下例所示:

  • 问题内容: 我有一个JSON响应,我需要将对应的JSON字符串映射到特定的Response类,是否有任何工具或框架可以做到这一点。 响应类为: Json响应字符串为{“ 0”:{“ 0”:“ Rockey”,“ 1”:“ John”}} 我将Apache CXF Framework与Jettison一起使用,因为JSON Provider还使用JAXB将数据连接到低带宽客户端。 请注意,我要将数字

  • 我有Json String看起来像这样 并希望将此Json字符串转换为对象的数组列表,并将所有元素放在类(数据Object.class)上并打印元素。 输出为: 我创建的类具有这种形式 我做错了什么?