从文本文件中读取JSON

时间:2010-07-19 22:12:29

标签: java json

我知道一些JSON库,我现在正在研究Google-JSON,但我想要实现的只是简单的事情,我想知道你会建议什么。

我想要一个JSON库,让我读取一个JSON文本文件,让我把它转换成字符串,int,boolean等。 - 现在使用Json.org/java

它可以阅读! BUT !!

import org.json.*;

public class readJ {

    public static String MapTitle;
    public static int[][] tiles;

    public static void main(String[] args) {

                       String json =
               "{"
               +"'name': 'map_one.txt',"
                +"'title': 'Map One',"
                +"'currentMap': 4,"
                +"'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 {
JSONObject JsonObj = new JSONObject(json);
MapTitle = JsonObj.getString("title");
tiles = JsonObj.getJSONArray("map");
}catch (JSONException er) {
    er.printStackTrace();
}

System.out.println(MapTitle);
System.out.println(tiles[0][1]);

    }
}

编译时我收到此错误:

C:\Users\Dan\Documents\readJSON\readJ.java:32: incompatible types
found   : org.json.JSONArray
required: int[][]
tiles = JsonObj.getJSONArray("map");
                            ^
1 error

Tool completed with exit code 1

7 个答案:

答案 0 :(得分:4)

安装Google Gson并创建这两个模型类

public class Data {
    private String name;
    private String title;
    private int currentMap;
    private List<Item> items;
    private int[][] map;

    public String getName() { return name; }
    public String getTitle() { return title; }
    public int getCurrentMap() { return currentMap; }
    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 class Item {
    private String name;
    private int x;
    private 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; }
}

按如下方式转换您的JSON:

Data data = new Gson().fromJson(json, Data.class);

要获得标题,请执行以下操作:

System.out.println(data.getTitle()); // Map One

要获得x = 3和y = 3的地图项目:

System.out.println(data.getMap()[3][3]); // 1

并获取第一个Item的名称:

System.out.println(data.getItems().get(0).getName()); // Pickaxe

轻松!使用Gson#toJson()即可轻松转换另一种方式。

String json = new Gson().toJson(data);

另见this answer另一个复杂的Gson示例。

答案 1 :(得分:3)

我推荐这个库: http://www.json.org/java/

您只需要从字符串创建一个JSONObject,并获得名称proprety。

JSONObject JsonObj = JSONObject( InputStr );
String MapTitle = JsonObj.getString("title");

下载源代码,并将其导入您的项目:http://www.json.org/java/json.zip

答案 2 :(得分:1)

Spring Framework使用Jackson,因此对Jackson来说是一个相当不错的认可。

JacksonInFiveMinutes

如果您只想使用通用地图,请参阅“简单数据绑定示例”标题。

答案 3 :(得分:1)

至于错误信息。

C:\Users\Dan\Documents\readJSON\readJ.java:2: cannot find symbol
symbol  : class json
location: package org
import org.json;
      ^

您通常不会以要导入的包的方式命名您的包,尽管可以。

您必须:1名称不同,2 .-不要输入

C:\Users\Dan\Documents\readJSON\readJ.java:27: cannot find symbol
symbol  : method JSONObject(java.lang.String)
location: class org.json.readJ
JSONObject JsonObj = JSONObject(json);

你错过了一个“新”......它应该是new JSONObject(...

答案 4 :(得分:1)

  

org.json.JSONException:148之后的某个键[字符149第1行]

后需要':'

此处,您的json字符串无效:

 + "'map': [ { 1,3,1,1,1,24,1,1,1,1,1,1,1 },"

使用内部对象创建和数组,第一个对象具有没有值的属性1,3,1等。

应该是:

 + "'map': [ [ 1,3,1,1,1,24,1,1,1,1,1,1,1 ],"

这是一个内部有数组的数组。

或者

+ "'map': [ { 1:0,3:0,1:0,1:... 

所以你可以拥有值为0的属性1,3,1等但是......没有意义

答案 5 :(得分:0)

json-lib附带了一个将String转换为JSON对象的示例:

http://json-lib.sourceforge.net/snippets.html#Creating_a_JSONObject_from_a_JSON_formatted_string

答案 6 :(得分:0)

你可以使用google-gson做到这一点。我认为它看起来像这样:

JsonParser parser = new JsonParser();
JsonObject object = parser.parse(text).getAsJsonObject();

String title = object.get("title").getAsString();
int currentMap = object.get("currentMap").getAsInt();
...