通常需要使用Json,特别是它的读取和解析。在Java中,您通常知道您正在使用什么类型的变量,但是在解析 Json时,字段的类型可以是任何类型,这是令人困惑的。
解析Json的方法有哪些?怎么做?
在这里,我们说,如何从下面的Json中获取数据?
{
"firstName": "Json",
"lastName": "Smith",
"age": 30,
"address": {
"streetAddress": "666 1nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
"phoneNumbers": [
{
"type": "home",
"number": "542 666-1234"
},
{
"type": "fax",
"number": "653 666-4567"
}
],
"friends": [
{
"firstName": "Test",
"lastName": "Snow",
"age": 20,
"phoneNumbers": [
{
"type": "home",
"number": "141 111-1234"
}
],
"friends": [
{
"firstName": "UnknownFirstName",
"lastName": "UnknownLastName",
"age": 999,
"phoneNumbers": [
{
"type": "home",
"number": "000 000-0000"
}
]
}
]
},
{
"firstName": "Flash",
"lastName": "Tompson",
"age": 23,
"phoneNumbers": [
{
"type": "home",
"number": "999 111-1234"
}
]
}
]
}
您可以通过不同的方式获取数据,当然,这取决于任务。我将尝试考虑一些解析Json的选项。
注意:对于每个解析的例子,都会从问题中取出Json,以免在答案中徒劳地复制它。
简单的json
从哪里获得: 这里/ github 上的存储库/ 或通过Maven等。
这是最原始的方式。事实上,这里只有
JSONObject
和JSONArray
。JSONArray
可以包含多个对象JSONObject
,它可以在每次迭代时循环获取一个对象JSONObject
。JSONObject
- 您可以从中获取其各个属性的对象。我会将它用于小型Json字符串,在这种情况下您不必费心,或者如果您不太懒得根据下面显示的代码编写自己的处理程序类:
嵌套数组的其余工作类似。可以添加到List、Map等。
GSON
从哪里获得: 这里/ github 上的存储库/ 或通过Maven等。
文档: http: //www.studytrails.com/java/json/java-google-json-introduction/
允许您以与Json-simple相同的方式解析 Json,即 使用and (请参阅文档),但具有更强大的解析工具。创建重复Json 'a 结构的类就足够了。要从问题中解析Json,让我们创建类:
JSONObject
JSONArray
现在写就足够了:
一切!魔法!奇迹!现在有
person
一个 type 的对象Person
,它包含的数据与创建的类中指定的类型完全相同!现在您可以使用任何类型,就像您过去经常做的那样:String、Integer、List、Map 和其他所有类型。解析示例
Map
:...... JSON解析:
......类(POJO):
...... 分析本身是这样的:
一切。
此外,可以在GSON中使用注解 ,例如:在解析时排除指定字段、更改变量名称(例如 not
personFirstName
、 butfName
)等等。有关详细信息,请参阅文档。杰克逊
从哪里获得: 这里/ github 上的存储库/ 或通过Maven等。
文档和示例: https ://github.com/FasterXML/jackson-docs
与GSON一样,它还允许您使用
JSONObject
andJSONArray
如果需要,还可以根据提供的类进行解析(参见下面的示例)。类似地,由于注解,它可以指定额外的要求,例如:不解析指定的字段、使用自定义类构造函数、更改变量名称(例如,not
firstName
、butfName
)等等。有关详细信息,请参阅文档。JsonPath
从哪里获得它:通过Maven和其他构建器/ github 存储库
指的是所谓的XPath库。其本质与xml
xpath
类似,即很容易从json 'a 中获取一些信息,沿着指定的路径。它还允许您按条件过滤。按条件选择的示例:
更多选择
洛根广场
LoganSquare - 基于Jackson的流 API。根据演示的测试,它比GSON和Jackson运行得更快。因此对安卓有好处。
从哪里获得: github 上的存储库/或通过Maven / Gradle等。
用法: https ://github.com/bluelinelabs/LoganSquare#usage
@JsonObject
@JsonField
(例如输入参数的不同变体@JsonField(name="message")
)Простенький пример:
разбор:
Moshi
Хорош, как утверждают разработчики, для работы с Android.
Где взять: репозиторий на github / или через Maven / Gradle и пр.
Пример разбора Json строки в объект
Person
:Пример парсинга в
Map
:Genson
Где взять: здесь / репозиторий на github / или через Maven и пр.
Документация: http://owlike.github.io/genson/Documentation/UserGuide/
За счет создания POJO (создаются классы, которые повторяют структуру Json'а) - парсится объект из строки, распихивая по нужным полям объектов. Есть возможность фильтровать свойства, включить или исключить поля при парсинге, переименовать, возможность работы с аннотациями и пр. Подробнее в документации.
Простой парсинг:
Разбор в список:
Пример парсинга в
Map
:...... JSON для разбора:
...... Классы (POJO):
...... Сам парсинг:
FastJson
Где взять: через Maven и другие сборщики / репозиторий на github. Непосредственно описание работы с xpath. Осторожно, ̶н̶е̶н̶о̶р̶м̶а̶т̶и̶в̶н̶а̶я̶ ̶л̶е̶к̶с̶и̶к̶а̶ китайский язык.
Относится к XPath аналогам.
Обычный способ:
Применение XPpath
JSON-P
支持 JSON 序列化和解析,无需在类中进行预映射:
行家:
解析 JSON 字符串的示例:
将对象输出到 JSON 字符串的示例:
结论:
Здесь расположена общая информация о парсерах, которая может помочь при выборе и понять, что он умеет. Текст и таблица, представленные ниже, взяты из публикации на Habrahabr: Шпаргалка Java программиста 8. Библиотеки для работы с Json, автор статьи @ВеденинВячеслав
Таблица библиотек и способы парсинга, которые они поддерживают:
* — Генерация классов для Data bind позволяет сгенерировать классы на стадии компиляции, что в теории должно давать значительный прирост производительности библиотеки,
** — Работает со static inner class имеет смысл только для случая Data bind, возможно ли сериализация и десериализация для случая статических внутренних классов (не статические внутренние классы сериализовать не рекомендуется),
*** — тоже только для случая Data bind можно ли не использовать аннотации или их использование крайне рекомендуется,