Не удается разобрать свойство JSON "null" - PullRequest
3 голосов
/ 14 июля 2011

Я столкнулся с одной проблемой, когда пытался проанализировать свойство JSON "null", пожалуйста, помогите мне понять, в чем реальная проблема.У меня был следующий JSON:

{
  "properties" : {        
    "null" : {
      "value" : false
    }
  }
}

Я использовал http://jsonlint.com, чтобы проверить, что этот JSON действителен.Я попытался разобрать его из Java:

import net.sf.json.JSONObject;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        String st = "{" +
                "      'properties' : {" +
                "        'null' : {" +
                "          'value' : false" +
                "        }" +
                "      }" +
                "}";
        JSONObject.fromObject(st);
    }
}

Но получил исключение:

Exception in thread "main" java.lang.ClassCastException: JSON keys must be strings.
    at net.sf.json.JSONObject._fromJSONObject(JSONObject.java:927)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:155)
    at net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:108)
    at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:238)
    at net.sf.json.JSONObject._processValue(JSONObject.java:2655)
    at net.sf.json.JSONObject.processValue(JSONObject.java:2721)
    at net.sf.json.JSONObject.element(JSONObject.java:1786)
    at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1036)
    at net.sf.json.JSONObject._fromString(JSONObject.java:1201)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:165)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:134)

Я использовал json-lib-2.4-jdk15.jar из http://json -lib.sourceforge.net для его анализа.Кто-нибудь может уточнить это?Почему эта библиотека выдает исключение, но онлайн-валидатор сказал, что это допустимый JSON?Это ошибка в библиотеке или я что-то не так сделал?

Ответы [ 4 ]

3 голосов
/ 15 июля 2011

JSON-lib первоначально анализирует и заполняет карту Java входным JSON. К сожалению, JSON-lib затем проверяет, является ли каждое имя элемента объекта JSON JSON null. Проверка null выполняется методом JSONNull.equals(Object). Этот метод возвращает true для «пустой» строки JSON, которая, конечно, на самом деле не является значением JSON null.

Я рекомендую сообщить об ошибке в проекте JSON-lib для этой проблемы. Реализация JSONNull.equals(Object) имеет недостатки.

К сожалению, невозможно обработать это с помощью пользовательского PropertyNameProcessor.

Опции, доступные для более быстрого решения, включают самостоятельное изменение кода JSON-lib или переключение библиотек.

Если вы можете переключать библиотеки, я настоятельно рекомендую Джексон . Ниже приведен пример его использования для десериализации примера JSON из исходного вопроса.

/*
{
  "properties" : {        
    "null" : {
      "value" : false
    }
  }
}
 */
String json = "{\"properties\":{\"null\":{\"value\":false}}}";

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(json, Map.class);
System.out.println(map);
// output: {properties={null={value=false}}}

Map<String, Object> propertiesMap = (Map) map.get("properties");
System.out.println(propertiesMap);
// output: {null={value=false}}

Map<String, Object> nullMap = (Map) propertiesMap.get("null");
System.out.println(nullMap);
// output: {value=false}
2 голосов
/ 14 июля 2011

Первый опубликованный JSON является допустимым JSON: JSON в Java, однако, недействителен - только " действителен для [обязательного] ключевого предложения. От json.org :

Строка - это последовательность из нуля или более символов Юникода, , заключенная в двойные кавычки , с использованием обратной косой черты ....

Однако, это звучит как ошибка, при условии, что он не был вызван неверным JSON, переданным ему (библиотека может делать все, что захочет, с недопустимым JSON) ... нужно было бы взглянуть на источник (или отчеты об ошибках / опыт пользователя), чтобы окончательно сказать, действительно ли это «ошибка». Ниже я добавил некоторые предложения, которые можно попробовать, которые могут либо показать ожидаемое поведение, либо описать причину / проблему более подробно.

Рассмотрим этот минимальный тест-кейс (с допустимым JSON):

String st = "{ \"null\": \"hello world!\" }";

Это также может пролить больше света, в зависимости от того, является ли первый элемент "null" или null при извлечении:

String st = "[ \"null\" ]";

Удачного кодирования.

0 голосов
/ 02 марта 2012

Ссылка на библиотеку gson:

http://code.google.com/p/google-gson/

Обычно я использую gson для генерации строки josn, поэтому я нашел пример, который кто-то другой разместил в stackoverflow для разбора строки json с gson, см. Ссылку:

Преобразование JSON в Java

0 голосов
/ 14 июля 2011

предлагаю вам использовать Gson,

и создайте строку json, используя java Map и List, затем используйте Gson для вывода объекта Map или List

...