我有以下json文本。如何解析它以获得 pageName
, pagePic
, post_id
等等。?
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
17条答案
按热度按时间jfgube3f1#
现在有许多开源库可以将json内容解析为对象或只是读取json值。您的需求只是读取值并将其解析为自定义对象。所以org.json库就足够了。
使用org.json库解析并创建jsonobject:
现在,使用此对象获取值:
您可以看到一个完整的示例h
mccptt672#
gson易于学习和实现,我们需要知道以下两种方法
tojson()–将java对象转换为json格式
fromjson()–将json转换为java对象
`
`
23c0lvtd3#
如果您有一些表示json字符串(jsonstring)的java类(比如message),那么您可以将jackson json库用于:
您可以从message对象获取它的任何属性。
kuhbmx9i4#
由于还没有人提到它,下面是使用nashorn(javascript运行时是java8的一部分,但在java11中已被弃用)的解决方案的开始。
解决方案
性能比较
我编写的json内容包含三个数组,分别包含20、20和100个元素。我只想从第三个数组中得到100个元素。我使用下面的javascript函数来解析和获取我的条目。
使用nashorn执行一百万次呼叫需要7.5~7.8秒
org.json需要20~21秒
Jackson需要6.5~7秒
在本例中,jackson的性能比nashorn好,后者比org.json好得多。nashornapi比org.json或jackson更难使用。根据您的需求,jackson和nashorn都是可行的解决方案。
ql3eal8s5#
除了其他答案之外,我推荐这个在线开源服务jsonschema2pojo.org,用于从json或gson、jackson1.x或jackson2.x的json模式快速生成java类。例如,如果您有:
gson的jsonschema2pojo.org生成:
4c8rllxm6#
java中有许多可用的json库。
最臭名昭著的是:jackson、gson、genson、fastjson和org.json。
在选择任何库时,通常应注意以下三点:
演出
易用性(代码编写简单易读)-这与功能相匹配。
对于移动应用程序:依赖项/jar大小
特别是对于json库(以及任何序列化/反序列化lib),数据绑定通常也很有趣,因为它不需要编写锅炉板代码来打包/解包数据。
对于1,请参见以下基准:https://github.com/fabienrenaud/java-json-benchmark 我使用jmh来比较(jackson、gson、genson、fastjson、org.json、jsonp)使用流和数据绑定api的序列化程序和反序列化程序的性能。对于2,你可以在网上找到许多例子。上面的基准也可以作为例子的来源。。。
快速获取基准:jackson的性能是org.json的5到6倍,是gson的两倍多。
对于您的特定示例,下面的代码用jackson解码您的json:
如果你有任何问题,请告诉我。
ymdaylpp7#
这件事太容易了,让我大吃一惊。你可以通过一个
String
将json保存到默认org.json包中jsonobject的构造函数中。完成。放下麦克风。这适用于
JSONObjects
也。在那之后,你可以看看你的等级制度Objects
使用get()
对象上的方法。1qczuiv08#
下面的示例显示如何读取问题中的文本,用“jsontext”变量表示。这个解决方案使用javaee7javax.jsonapi(在其他一些答案中提到)。我之所以添加它作为一个单独的答案,是因为下面的代码显示了如何实际访问问题中显示的一些值。运行此代码需要javax.jsonapi的实现。因为我不想声明“import”语句,所以包含了每个所需类的完整包。
现在,在任何人因为这个答案不使用gson、org.json、jackson或其他任何第三方框架而对它投反对票之前,它是每个问题的“必需代码”的一个例子,用于解析提供的文本。我很清楚,jdk9没有考虑遵守当前的标准jsr353,因此jsr353规范应该与任何其他第三方json处理实现一样对待。
xjreopfe9#
我相信最好的实践应该是通过官方的javajsonapi,它仍在进行中。
mccptt6710#
org.json库易于使用。
只要记住(当铸造或使用像
getJSONObject
以及getJSONArray
)用json符号表示[ … ]
表示一个数组,所以库将把它解析为JSONArray
{ … }
表示一个对象,所以库将把它解析为JSONObject
示例代码如下:您可以从以下内容中找到更多示例:在java中解析json
可下载jar:http://mvnrepository.com/artifact/org.json/json
6rqinv9w11#
使用最简单的json,这是非常快速和易于使用的。您可以从字符串obj和stream进行解析。
样本数据:
解析:
创建json:
Maven:
mmvthczy12#
a-解释
您可以使用jackson库将json字符串绑定到pojo(普通旧java对象)示例中。pojo只是一个只有私有字段和公共getter/setter方法的类。jackson将遍历这些方法(使用反射),并将json对象Map到pojo示例中,因为类的字段名与json对象的字段名相匹配。
在json对象(实际上是一个复合对象)中,主对象由两个子对象组成。因此,我们的pojo类应该具有相同的层次结构。我将整个json对象称为page对象。page对象由pageinfo对象和post对象数组组成。
所以我们必须创建三个不同的pojo类;
page类,pageinfo类和post示例数组的组合
pageinfo类
posts类
我唯一使用的包是jackson objectmapper,我们所做的是绑定数据;
对于所需的依赖关系,jar文件如下所示;
jackson-core-2.5.1.jar文件
jackson-databind-2.5.1.jar
jackson-annotations-2.5.0.jar版本
这里是所需的代码;
b-主pojo类:第页
c-child pojo类:pageinfo
d-child pojo类:post
e-sample json文件:samplejsonfile.json
我刚刚将您的json示例复制到这个文件中,并将其放在项目文件夹下。
f-演示代码
g-演示输出
ipakzgxi13#
几乎所有给出的答案都要求在访问感兴趣的属性中的值之前将json完全反序列化为java对象。另一种不走这条路线的方法是使用jsonpath,它类似于json的xpath,允许遍历json对象。
这是一个规范,jayway的好心人为该规范创建了一个java实现,您可以在这里找到:https://github.com/jayway/jsonpath
因此,基本上要使用它,请将其添加到您的项目中,例如:
以及使用:
等。。。
请查看jsonpath规范页面,以获取有关其他方式转换json的更多信息。
k4ymrczo14#
你可以使用googlegson。
使用这个库,您只需要创建一个具有相同json结构的模型。然后自动填充模型。您必须调用变量作为json键,或者使用
@SerializedName
如果你想用不同的名字。json文件
从你的例子来看:
型号
解析
现在可以使用gson库进行解析:
渐变导入
记住在app gradle文件中导入库
模型自动生成
您可以使用这样的在线工具从json自动生成模型。
of1yzvn415#
快速json解析器非常简单、灵活、快速且可定制。试试看
特征:
符合json规范(rfc4627)
高性能json解析器
支持灵活/可配置的解析方法
任何json层次结构的键/值对的可配置验证
易于使用#占地面积非常小
引发开发人员友好且易于跟踪的异常
可插入的自定义验证支持-可以在遇到时通过配置自定义验证程序来验证密钥/值
验证和非验证解析器支持
支持两种类型的配置(json/xml)以使用快速json验证解析器
需要jdk 1.5
不依赖外部库
通过对象序列化支持json生成
在解析过程中支持集合类型选择
可以这样使用: