Java 从文本文件中读取 JSON
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3285514/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Reading JSON from a text file
提问by test
I know of some JSON libs around and I'm currently looking into Google-JSON but all I want to achieve is something simple and I want to know what you would suggest.
我知道周围有一些 JSON 库,我目前正在研究 Google-JSON,但我想要实现的只是一些简单的事情,我想知道您的建议。
I want a JSON library which will let me read a textfile that is in JSON and let me convert it into strings, int, boolean, etc. -- Now using Json.org/java
我想要一个 JSON 库,它可以让我读取 JSON 格式的文本文件,并让我将其转换为字符串、整数、布尔值等。 -- 现在使用 Json.org/java
It can READ! 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]);
}
}
When compiling I get this error:
编译时出现此错误:
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
采纳答案by BalusC
Install Google Gsonand create those two model classes
安装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; }
}
and
和
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; }
}
And convert your JSON as follows:
并按如下方式转换您的 JSON:
Data data = new Gson().fromJson(json, Data.class);
To get the title just do:
要获得标题,只需执行以下操作:
System.out.println(data.getTitle()); // Map One
And to get the map item at x=3 and y=3:
并在 x=3 和 y=3 处获取地图项:
System.out.println(data.getMap()[3][3]); // 1
And to get the name of the first Item
:
并获得第一个的名称Item
:
System.out.println(data.getItems().get(0).getName()); // Pickaxe
Easy! Converting the other way on is also simple using Gson#toJson()
.
简单!使用Gson#toJson()
.
String json = new Gson().toJson(data);
See also this answerfor another complex Gson example.
另请参阅此答案以了解另一个复杂的 Gson 示例。
回答by Nican
I recommend this library: http://www.json.org/java/
我推荐这个库:http: //www.json.org/java/
You simply have to create a JSONObject from string, and get the name proprety.
您只需从字符串创建一个 JSONObject,并获取名称属性。
JSONObject JsonObj = JSONObject( InputStr );
String MapTitle = JsonObj.getString("title");
Download the source, and import it into your project: http://www.json.org/java/json.zip
下载源代码,并将其导入您的项目:http: //www.json.org/java/json.zip
回答by tim_yates
json-lib comes with an example of converting a String to a JSON Object:
json-lib 附带了一个将字符串转换为 JSON 对象的示例:
http://json-lib.sourceforge.net/snippets.html#Creating_a_JSONObject_from_a_JSON_formatted_string
http://json-lib.sourceforge.net/snippets.html#Creating_a_JSONObject_from_a_JSON_formatted_string
回答by Paul Grime
The Spring Framework uses Hymanson, so that's a fairly good endorsement for Hymanson.
Spring Framework 使用 Hymanson,所以这是对 Hymanson 的一个很好的认可。
See the "Simple Data Binding Example" heading if you just want to use generic Maps.
如果您只想使用通用地图,请参阅“简单数据绑定示例”标题。
回答by ColinD
You can do this just fine with google-gson. I think it'd look something like this:
你可以用 google-gson 很好地做到这一点。我认为它看起来像这样:
JsonParser parser = new JsonParser();
JsonObject object = parser.parse(text).getAsJsonObject();
String title = object.get("title").getAsString();
int currentMap = object.get("currentMap").getAsInt();
...
回答by OscarRyz
As for the error messages.
至于错误信息。
C:\Users\Dan\Documents\readJSON\readJ.java:2: cannot find symbol
symbol : class json
location: package org
import org.json;
^
You don't usually name your package the same way the package you want to import, although you can.
尽管您可以,但您通常不会以要导入的包的相同方式命名您的包。
You have to either: 1 name it different, 2.- don't put the import
您必须: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);
You're missing a "new" there... it should be new JSONObject(...
你在那里错过了一个“新的”......它应该是 new JSONObject(...
回答by OscarRyz
org.json.JSONException: Expected a ':' after a key at 148 [character 149 line 1]
org.json.JSONException: 在 148 [character 149 line 1] 的键后需要一个“:”
Here, your json string is invalid:
在这里,您的 json 字符串无效:
+ "'map': [ { 1,3,1,1,1,24,1,1,1,1,1,1,1 },"
That creates and array with objects inside, the first object has the attributes 1,3,1
etc without value.
里面的对象创建和数组,第一个对象具有1,3,1
没有值的属性等。
Should be:
应该:
+ "'map': [ [ 1,3,1,1,1,24,1,1,1,1,1,1,1 ],"
For that to be an array with arrays inside.
因为它是一个里面有数组的数组。
Or
或者
+ "'map': [ { 1:0,3:0,1:0,1:...
So you can have attributes 1,3,1 etc with value 0 but... that doesn't make sense
因此,您可以拥有值为 0 的属性 1,3,1 等,但这没有意义