【问题标题】:Java reading JSON nullJava读取JSON null
【发布时间】:2010-07-20 22:13:59
【问题描述】:

好吧,无论出于何种原因,我都无法理解。

这是我的代码:

import java.util.*;
import java.io.*;
import com.google.gson.*;


public class readGoogle {

    public static String MapTitle;
    public static Data data;
    public static Item item;
    public static String dan;
    public static FileReader fr;


        public static void main(String[] args) {

            /**
try {
    fr = new FileReader("map1.txt");
}catch(FileNotFoundException fne) {
    fne.printStackTrace();
}
        StringBuffer sb = new StringBuffer();
        char[] b = new char[1000];
        int n = 0;
        try {
        while ((n = fr.read(b)) > 0) {
             sb.append(b, 0, n);
         }
         }catch(IOException rex) {
             rex.printStackTrace();
         }
        String fileString = sb.toString();
        **/

                               String json =
                               "{"
                               +"'name': 'map_one.txt',"
                               +"'title': 'xxx One',"
                               +"'currentMap': 4,"
                               +"'rightMap': 3,"
                               +"'lefttMap': 5,"
                               +"'downMap': 1,"
                               +"'upMap': 2,"
                               +"'items': ["
                               +"   { name: 'Pickaxe', x: 5, y: 1 },"
                               +"   { name: 'Battleaxe', x: 2, y: 3 }"
                               +"],"
                               +"   'map': [ [ 1,3,1,1,1,24,1,1,1,1,1,1,1 ],"
                               +"   [ 1,3,1,1,1,24,1,1,1,1,1,1,1 ],"
                               +"   [ 1,7,1,1,1,24,1,1,24,1,1,1,1 ],"
                               +"   [ 1,7,1,1,7,1,1,1,24,1,1,1,1 ],"
                               +"   [ 1,7,7,7,1,24,24,24,24,1,1,1,1 ],"
                               +"   [ 1,1,7,1,1,24,1,24,1,1,1,1,1 ],"
                               +"   [ 1,1,1,1,1,24,1,1,1,1,1,1,1 ],"
                               +"   [ 1,1,3,1,1,24,1,1,1,1,1,1,1 ],"
                               +"   [ 1,3,3,1,1,24,1,1,1,1,1,1,1 ]]"
+"};";


    try {
    data = new Gson().fromJson(json, Data.class);
    }catch (Exception er) {
        er.printStackTrace();
    }

    System.out.println("Name of map: " + data.getTitle());
    System.out.println("File of map: " + data.getName());
    System.out.println("Current Map: " + data.getCurrentMap());
    System.out.println(data.getItems().get(0).getName()); // Pickaxe



    }

public class Item {
        public String name;
        public int x;
        public int y;

        public String getName() { return name; }
        public int getX() { return x; }
        public int getY() { return y; }

        public void setName(String name) { this.name = name; }
        public void setX(int x) { this.x = x; }
        public void setY(int y) { this.y = y; }
    }

      public static class Data {
            private String name;
            private String title;
            private int currentMap;
            private int leftMap;
            private int rightMap;
            private int upMap;
            private int downMap;
            private List<Item> items;
            private int[][] map;

            public String getName() { return name; }
            public String getTitle() { return title; }
            public int getCurrentMap() { return currentMap; }
            public int getUpMap() { return upMap; }
            public int getDownMap() { return downMap; }
            public int getLeftMap() { return leftMap; }
            public int getRightMap() { return rightMap; }
            public List<Item> getItems() { return items; }
            public int[][] getMap() { return map; }

            public void setName(String name) { this.name = name; }
            public void setTitle(String title) { this.title = title; }
            public void setCurrentMap(int currentMap) { this.currentMap = currentMap; }
            public void setItems(List<Item> items) { this.items = items; }
            public void setMap(int[][] map) { this.map = map; }
        }

}


public static class Item {
        public static String name;
        public static int x;
        public int y;

        public static String getName() { return name; }
        public static int getX() { return x; }
        public int getY() { return y; }

        public void setName(String name) { this.name = name; }
        public void setX(int x) { this.x = x; }
        public void setY(int y) { this.y = y; }
    }

      public static class Data {
            private String name;
            private String title;
            private int currentMap;
            private int leftMap;
            private int rightMap;
            private int upMap;
            private int downMap;
            private List<Item> items;
            private int[][] map;

            public String getName() { return name; }
            public String getTitle() { return title; }
            public int getCurrentMap() { return currentMap; }
            public int getUpMap() { return upMap; }
            public int getDownMap() { return downMap; }
            public int getLeftMap() { return leftMap; }
            public int getRightMap() { return rightMap; }
            public List<Item> getItems() { return items; }
            public int[][] getMap() { return map; }

            public void setName(String name) { this.name = name; }
            public void setTitle(String title) { this.title = title; }
            public void setCurrentMap(int currentMap) { this.currentMap = currentMap; }
            public void setItems(List<Item> items) { this.items = items; }
            public void setMap(int[][] map) { this.map = map; }
        }

}

这是输出:

    com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.Default
TypeAdapters$CollectionTypeAdapter@6016a786 failed to deserialized json object [
{"name":"Pickaxe","x":5,"y":1},{"name":"Battleaxe","x":2,"y":3}] given the type
com.google.gson.ParameterizedTypeImpl@6c59096e
        at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDese
rializerExceptionWrapper.java:63)
        at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(J
sonDeserializationVisitor.java:88)
        at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCusto
mHandler(JsonObjectDeserializationVisitor.java:117)
        at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.j
ava:150)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:123)
        at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(Json
DeserializationContextDefault.java:73)
        at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDes
erializationContextDefault.java:51)
        at com.google.gson.Gson.fromJson(Gson.java:495)
        at com.google.gson.Gson.fromJson(Gson.java:444)
        at com.google.gson.Gson.fromJson(Gson.java:396)
        at com.google.gson.Gson.fromJson(Gson.java:372)
        at readGoogle.main(readGoogle.java:62)
Caused by: java.lang.RuntimeException: No-args constructor for class readGoogle$
Item does not exist. Register an InstanceCreator with Gson for this type to fix
this problem.
        at com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor
(MappedObjectConstructor.java:64)
        at com.google.gson.MappedObjectConstructor.construct(MappedObjectConstru
ctor.java:53)
        at com.google.gson.JsonObjectDeserializationVisitor.constructTarget(Json
ObjectDeserializationVisitor.java:41)
        at com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializat
ionVisitor.java:56)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)
        at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(Json
DeserializationContextDefault.java:73)
        at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDes
erializationContextDefault.java:51)
        at com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter.deserialize
(DefaultTypeAdapters.java:472)
        at com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter.deserialize
(DefaultTypeAdapters.java:435)
        at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDese
rializerExceptionWrapper.java:50)
        ... 11 more
Exception in thread "main" java.lang.NullPointerException
        at readGoogle.main(readGoogle.java:67)
Press any key to continue . . .

Items json 数组中有问题... :S

【问题讨论】:

  • 我注意到您在列出的代码中定义了两次 ItemData。在一种情况下,Item 被定义为没有关键字 staticreadGoogle 的内部类。如果使用Item 的定义,Gson 可能会尝试创建readGoogle 的实例以包含Items,这将解释您列出的异常。

标签: java json arrays gson


【解决方案1】:

您确定 Item 的属性“名称”应该是静态的吗?我觉得不合适……

edit -- 和属性'x'

edit -- 如果你查看堆栈跟踪,它会说

Caused by: java.lang.RuntimeException: No-args constructor for class readGoogle$
Item does not exist.

所以你需要提供一个公开且不带参数的构造函数。

【讨论】:

  • 是的,这些都不应该是static。 Gson 在对象上设置实例字段...因为name 没有实例字段,所以在读取 JSON 时会忽略它。
  • 现在是时候找出每个数组中有多少项目了。所以对于“项目”:将是 2!
  • @Dan:List has a size() method。与其对 Java 大喊大叫,不如花点精力学习基本的 Java。关注Trails covering the basics。一切都很重要,当您不想进行 UI 开发时,期待 Swing。祝你好运。
  • @hvgotcodes 作为记录,Gson 不需要 setter、getter 或 Serializable。它直接在字段上设置数据,您如何处理它们(是否使用 getter 公开它们)取决于您。虽然不需要 arg 构造函数。
  • @BalusC,事情是这样的。我做到了。然后我把它弄丢了。所以现在我退出了;)
【解决方案2】:

我遇到了类似的问题,并通过阅读有关嵌套内部类的文档 http://sites.google.com/site/gson/gson-user-guide 解决了它。您需要将您的项目类定义为嵌套的数据类,并将其声明为静态,并使用一个空的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多