【问题标题】:Using Gson to parse Json array and object with no name使用Gson解析Json数组和无名对象
【发布时间】:2012-12-06 02:43:13
【问题描述】:

我知道有许多带有 GSON 的 JSON 问题,但没有一个与我直接相关。我的 JSON 格式不同。

我想使用 GSON 解析一个 JSON 数据,如下所示:

[
   {
    "foo":"1",
    "bar":[ { "_id":"bar1"} ],
    "too":["mall", "park"]
   }
]

我有模型类:

ItemArray 类

public class ItemArray
{
   List<Item> itemArray;

   //Get set here
}

物品类

public class Item
{
   String foo;
   List<Bar> bar;
   List<String> too;

   //Get set here
}

酒吧类

public class Bar
{
   String id;

   //Get set here
}

问题来了。 JSON 格式是否正确?如果是,模型类的格式是否正确?

如果不是,请把我推向正确的方向。提前谢谢!

PS。如果需要,我可以修改 JSON 数据格式。

【问题讨论】:

    标签: java android json gson


    【解决方案1】:

    根据你的 json,你应该有:

    public class ItemArray extends List<Item> {
    }
    

    如果你想保留你的 java 类并改变你的 json 它应该是:

    {
     itemArray: [
         {
          "foo":"1",
          "bar":[ { "_id":"bar1"} ],
          "too":["mall", "park"]
         }
      ]
    }
    

    哦,Bar 的 id 和 _id 不匹配:

    public class Bar
    {
       String _id;
    
       //Get set here
    }
    

    您还可以在 Json 反序列化过程中使用注释来更改字段的名称。

    最后但并非最不重要的一点是,考虑更好地键入您的值。如果不是,不要将任何数据视为字符串,您将不会在 java 代码中进行大量处理来转换事物。例如:

    "foo" : 1,
    

    并将 foo 视为 int 数据成员,而不是 String。

    【讨论】:

    • 所以换句话说,我只需要一个类 ItemArray + Item 类当然不改变我的 JSON 格式?
    • 我认为是的。并将 Bar 从 id 更改为 _id。
    • 实际上这比在 SOF 上询问要短;)
    • 在我修复了日期转换问题后,它可以工作了。再次感谢。我上面发布的内容是假的,所以我不会透露真实数据:/ NDA,如果你理解的话
    • 在这种情况下,您可以有一个模型类来设置 json 数组中的项目列表(List)。有另一个类“ItemTypes”,它将设置 json 数组的所有单个项目。
    【解决方案2】:

    有时我们会收到JsonArray [ {..} , {..} ] 作为回复(没有像你这样的'itemArray' 名称) 在这种情况下,您可以使用以下代码

    Type fooType = new TypeToken<ArrayList<Item>>() {}.getType();
    List<Item> array = new Gson().fromJson(response, fooType);
    

    了解更多关于这个Official doc - Gson Array-Examples

    【讨论】:

    • 另一个答案只告诉您在 API 中进行哪些更改以使其工作,这并不总是可能的。这是正确的答案。
    【解决方案3】:

    如果您有 JsonArray 之类的 [ {..} , {..} ],则可以使用 Gson:

    Item[] items = gson.fromJson(json, Item[].class);
    

    【讨论】:

    • 我如何进一步解析这个...即访问 Item.class 中的字符串?
    【解决方案4】:

    要检查 Json 是否有效,请使用此工具 http://jsonlint.com/

    Class Bar(
       private String _id;
       //create getter/setters
    {
    
    public class Item
    {
       String foo;
       List<Bar> bar;
       List<String> too;
    
       //Get set here
    }
    //this is also fine
    public class ItemList
    {
       List<Item> itemArray;
    
       //Get set here
    }
    

    您将项目列表命名为“itemArray”,但在您的 json 中,您没有将相应的项目数组命名为“itemArray”。 所以让它成为itemArray,问题不在你的json中,它是有效的。问题在于它对 Gson 的表示, Gson 将 json 的键映射到同名对象(即 Java POJO)的变量上。 如果你的列表名称是 Class 是

    List<Item> itemArray;
    

    那么对应的json数组名也应该是itemArray,看看吹

    {
     itemArray: [
         {
          "foo":"1",
          "bar":[ { "_id":"bar1"} ],
          "too":["mall", "park"]
         }
      ]
    }
    

    这样你就可以将json转换成这样的对象

     Reader reader = new InputStreamReader(IOUtils.toInputStream(json_string));
     ItemList itemList = json.toObject(reader, ItemList.class);
    

    查看打击参考以获取更多详细信息 https://stackoverflow.com/questions/13625206/how-to-parse-the-result-in-java/13625567#13625567

    【讨论】:

    • 第一个答案回答了我的问题。但感谢您的回答和洞察力。我以后会记住这一点的:D
    • 如果我无法更改 json 格式怎么办。也就是说,如果我无法在 json 中添加“itemArray”,如何设置模型?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多