Чтение JSON из текстового файла - PullRequest
8 голосов
/ 20 июля 2010

Я знаю о некоторых JSON-библиотеках, и сейчас я изучаю Google-JSON, но все, чего я хочу добиться, - это нечто простое, и я хочу знать, что вы предлагаете.

Я хочу библиотеку JSONкоторый позволит мне прочитать текстовый файл в формате JSON и преобразовать его в строки, int, boolean и т. д. - Теперь с помощью Json.org/java

он может прочитать!НО !!

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 ]

4 голосов
/ 20 июля 2010

Установите 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);

См. Также этот ответ для другого сложного примера Gson.

3 голосов
/ 20 июля 2010

Я рекомендую эту библиотеку: http://www.json.org/java/

Вам просто нужно создать JSONObject из строки и получить имя proprety.

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

Загрузите исходный код и импортируйте его в свой проект: http://www.json.org/java/json.zip

1 голос
/ 20 июля 2010

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:... 

Таким образом, вы можете иметь атрибуты 1,3,1 и т. д. со значением 0, но ... это не имеет смысла

1 голос
/ 20 июля 2010

Что касается сообщений об ошибках.

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(...

1 голос
/ 20 июля 2010

Spring Framework использует Джексона, так что это неплохое одобрение для Джексона.

JacksonInFiveMinutes

См. Заголовок "Простой пример привязки данных", если вы просто хотитеиспользовать универсальные Карты.

0 голосов
/ 20 июля 2010

Вы можете сделать это просто отлично с google-gson.Я думаю, что это будет выглядеть примерно так:

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

String title = object.get("title").getAsString();
int currentMap = object.get("currentMap").getAsInt();
...
0 голосов
/ 20 июля 2010

json-lib поставляется с примером преобразования строки в объект JSON:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...