2013-09-09 1 views
0

По некоторым причинам я должен использовать определенную строку в моем проекте. Это текстовый файл (это JSON файла):Считывание элементов строки в определенном порядке

{"algorithm": 
[ 
    { "key": "onGapLeft", "value" : "moveLeft" }, 
    { "key": "onGapFront", "value" : "moveForward" }, 
    { "key": "onGapRight", "value" : "moveRight" }, 
    { "key": "default", "value" : "moveBackward" } 
] 
} 

Я определил его в JAVA, как это:

static String input = "{\"algorithm\": \n"+ 
"[ \n" + 
    "{ \"key\": \"onGapLeft\", \"value\" : \"moveLeft\" }, \n" + 
    "{ \"key\": \"onGapFront\", \"value\" : \"moveForward\" }, \n" + 
    "{ \"key\": \"onGapRight\", \"value\" : \"moveRight\" }, \n" + 
    "{ \"key\": \"default\", \"value\" : \"moveBackward\" } \n" + 
"] \n" + 
"}"; 

Теперь я должен изолировать ключи и значения в массиве:

key[0] = onGapLeft; value[0] = moveLeft; 
key[1] = onGapFront; value[1] = moveForward; 
key[2] = onGapRight; value[2] = moveRight; 
key[3] = default; value[3] = moveBackward; 

Я новичок в JAVA и не очень хорошо разбираюсь в строковом классе. Есть ли простой способ достичь этого результата? Ты бы мне очень помог!

Спасибо!

ОБНОВЛЕНИЕ: Я не объяснил это достаточно хорошо, извините. Эта программа будет работать на роботе LEGO NXT. JSON не будет работать там, как я хочу, поэтому я должен интерпретировать этот файл JSON как обычный STRING! Надеюсь, это объясняет, что я хочу :)

+0

Добро пожаловать в Stackoverflow. Если ваш вход String является строкой JSON, вы должны посмотреть на http://stackoverflow.com/questions/1395551/convert-a-json-string-to-object-in-java –

+0

Эй, спасибо! JSON, к сожалению, нет опции, потому что он не работает на моем Lego NXT Robot. Я должен интерпретировать этот файл JSON как строку. Извините, я не объяснил это достаточно хорошо! :) –

ответ

2

Я предлагаю решение в нескольких шага.

1) Давайте получим разные части вашей ~ JSON String. Мы будем использовать шаблон, чтобы получить различные {.*} части:

public static void main(String[] args) throws Exception{ 
    List<String> lines = new ArrayList<String>(); 

    Pattern p = Pattern.compile("\\{.*\\}"); 
    Matcher matcher = p.matcher(input); 
    while (matcher.find()) { 
    lines.add(matcher.group()); 
    } 
} 

(вы должны смотреть на Pattern и Matcher)

Теперь lines содержит 4 строки:

{ "key": "onGapLeft", "value" : "moveLeft" } 
{ "key": "onGapFront", "value" : "moveForward" } 
{ "key": "onGapRight", "value" : "moveRight" } 
{ "key": "default", "value" : "moveBackward" } 

Учитывая Строкой, подобной одному из них, вы можете удалить фигурные скобки с вызовом String#replaceAll();

(Вы должны смотреть на String String#replaceAll(String regex))

Теперь cleanLines содержит:

"key": "onGapLeft", "value" : "moveLeft" 
"key": "onGapFront", "value" : "moveForward" 
"key": "onGapRight", "value" : "moveRight" 
"key": "default", "value" : "moveBackward" 

2) Разберем одну из этих строк:

Учитывая такую ​​строку:

"key": "onGapLeft", "value" : "moveLeft" 

Y ou может разбить его на символ ,, используя String # split().Это даст вам String [], содержащий 2 элемента:

//parts[0] = "key": "onGapLeft" 
//parts[1] = "value" : "moveLeft" 
String[] parts = line.split(","); 

(Вы должны смотреть на String[] String#split(String regex))

Давайте очистить эти части (удалить «») и назначить их на некоторые переменные:

String keyStr = parts[0].replaceAll("\"","").trim(); //Now, key = key: onGapLeft 
String valueStr = parts[1].replaceAll("\"","").trim();//Now, value = value : moveLeft 

//Then, you split `key: onGapLeft` with character `:` 
String key = keyStr.split(":")[1].trim(); 

//And the same for `value : moveLeft` : 
String value = valueStr.split(":")[1].trim(); 

Вот и все!

Вы также должны взглянуть на Oracle's tutorial on regular expressions (Это действительно важно, и вы должны инвестировать время на него).

+0

Большое вам спасибо! Это была моя последняя попытка заставить эту программу работать правильно, и вы спасли меня! :) (к сожалению, я не могу выдвинуть это решение, потому что мне нужно 15 rep) –

+0

Еще один вопрос! :) Строка [] parts = line.split (","); строка в вашем случае является локальной строкой внутри аргумента for. Должно ли быть cleanLines.Split (",")? –

+0

Нет :) cleanLines - это 'String []'. 'String # split()' применим только к 'String'. Вам нужно перебирать строку 'String []' для работы с линиями один за другим. –

0

Здесь вам нужно использовать библиотеку парсеров JSON. Например, с помощью org.json можно разобрать как

String input = "{\"algorithm\": \n"+ 
     "[ \n" + 
      "{ \"key\": \"onGapLeft\", \"value\" : \"moveLeft\" }, \n" + 
      "{ \"key\": \"onGapFront\", \"value\" : \"moveForward\" }, \n" + 
      "{ \"key\": \"onGapRight\", \"value\" : \"moveRight\" }, \n" + 
      "{ \"key\": \"default\", \"value\" : \"moveBackward\" } \n" + 
     "] \n" + 
     "}"; 

JSONObject root = new JSONObject(input); 
JSONArray map = root.getJSONArray("algorithm"); 

for (int i = 0; i < map.length(); i++) { 
    JSONObject entry = map.getJSONObject(i); 
    System.out.println(entry.getString("key") + ": " 
          + entry.getString("value")); 
} 

Выход:

onGapLeft: moveLeft 
onGapFront: moveForward 
onGapRight: moveRight 
default: moveBackward 
+0

Эй, спасибо! JSON, к сожалению, нет опции, потому что он не работает на моем Lego NXT Robot. Я должен интерпретировать этот файл JSON как строку. Извините, я не объяснил это достаточно хорошо! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^