我有以下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条答案
按热度按时间6qftjkof1#
由于还没有人提到它,下面是使用nashorn(Java8的javascript运行时部分,但在Java11中已被弃用)的解决方案的开始。
解决方案
性能比较
我编写的json内容包含三个数组,分别包含20、20和100个元素。我只想从第三个数组中获取100个元素。我使用下面的javascript函数来解析和获取我的条目。
使用nashorn运行一百万次呼叫需要7.5~7.8秒
org.json需要20~21秒
Jackson需要6.5~7秒
在本例中,jackson的性能比nashorn好,nashorn的性能比org.json好得多。nashorn api比org.json或jackson更难使用。根据您的要求,jackson和nashorn都是可行的解决方案。
uyhoqukh2#
现在有许多开源库用于将json内容解析为对象或仅用于读取json值。您的需求只是读取值并将其解析为自定义对象。所以org.json库在您的情况下就足够了。
使用org.json库解析并创建jsonobject:
现在,使用此对象获取您的值:
您可以看到完整的示例h
5kgi1eie3#
gson易于学习和实现,我们需要知道以下两种方法
tojson()–将java对象转换为json格式
fromjson()–将json转换为java对象
`
`
disho6za4#
如果您有一些表示json字符串(jsonstring)的java类(比如消息),则可以将jackson json库用于:
您可以从消息对象获取其任何属性。
hgc7kmma5#
除了其他答案之外,我推荐这个在线开源服务jsonschema2pojo.org,用于从gson、jackson 1.x或jackson 2.x的json或json模式快速生成java类。例如,如果您有:
gson的jsonschema2pojo.org生成:
i34xakig6#
java中有许多可用的json库。
最臭名昭著的是:jackson、gson、genson、fastjson和org.json。
在选择任何库时,通常应考虑三件事:
演出
易用性(代码编写简单易读)-这与功能相匹配。
对于移动应用程序:依赖项/jar大小
特别是对于json库(以及任何序列化/反序列化库),数据绑定通常也很有趣,因为它不需要编写锅炉板代码来打包/解包数据。
对于1,请参见此基准:https://github.com/fabienrenaud/java-json-benchmark 我使用jmh比较了使用流和数据绑定API的序列化程序和反序列化程序的性能(jackson、gson、genson、fastjson、org.json、jsonp)。对于2,你可以在网上找到很多例子。上面的基准测试也可以用作示例源。。。
快速获取基准:jackson的性能是org.json的5到6倍,是gson的两倍多。
对于您的特定示例,以下代码使用jackson解码json:
如果你有任何问题,请告诉我。
ipakzgxi7#
这让我震惊,因为它是多么容易。你可以通过一个考试
String
将json保存到默认org.json包中jsonobject的构造函数中。完成。放下话筒。这与
JSONObjects
也在那之后,你就可以查看你的层次结构了Objects
使用get()
对象上的方法。4ktjp1zp8#
下面的示例显示如何读取问题中的文本,以“jsontext”变量表示。此解决方案使用java ee7 javax.json api(在其他一些答案中提到)。我之所以添加它作为一个单独的答案,是因为下面的代码显示了如何实际访问问题中显示的一些值。运行此代码需要javax.json api的实现。由于我不想声明“import”语句,所以包含了每个所需类的完整包。
现在,在任何人因为不使用gson、org.json、jackson或任何其他可用的第三方框架而对这个答案投反对票之前,这是一个根据问题解析提供文本的“必需代码”的示例。我很清楚,jdk 9没有考虑遵守当前的标准JSR353,因此JSR353规范应该与任何其他第三方json处理实现一样对待。
ippsafx79#
我认为最佳实践应该是通过官方的JavaJSONAPI,该api仍在开发中。
pvabu6sv10#
org.json库易于使用。
只要记住(当铸造或使用类似的方法时
getJSONObject
及getJSONArray
)用json符号表示[ … ]
表示一个数组,所以库会将其解析为JSONArray
{ … }
表示一个对象,所以库会将其解析为JSONObject
示例代码如下:您可以从以下内容中找到更多示例:在java中解析json
可下载jar:http://mvnrepository.com/artifact/org.json/json
unftdfkk11#
使用最简单的json,它非常快速且易于使用。您可以从字符串obj和stream进行解析。
样本数据:
解析:
创建json:
Maven:
thtygnil12#
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类
波斯特班
我使用的唯一软件包是jackson objectmapper,我们所做的是绑定数据;
对于所需的依赖项,下面列出了jar文件;
jackson-core-2.5.1.jar
jackson-databind-2.5.1.jar
jackson-annotations-2.5.0.jar
这是所需的代码;
b-主pojo类:第页
c-子pojo类:pageinfo
d-儿童pojo类:post
e-示例json文件:samplejsonfile.json
我刚刚将您的json示例复制到这个文件中,并将其放在项目文件夹下。
f-演示代码
g-演示输出
xzv2uavs13#
几乎所有给出的答案都需要在访问感兴趣的属性中的值之前将json完全反序列化为java对象。另一种不走这条路线的选择是使用jsonpath,它类似于json的xpath,允许遍历json对象。
这是一个规范,jayway的好人为该规范创建了一个java实现,您可以在这里找到:https://github.com/jayway/jsonpath
因此,基本上要使用它,请将其添加到您的项目中,例如:
以及使用:
等
查看jsonpath规范页面,以了解有关跨json的其他方法的更多信息。
c9qzyr3d14#
你可以使用谷歌gson。
使用这个库,您只需要创建一个具有相同json结构的模型。然后自动填充模型。您必须调用变量作为json键,或者使用
@SerializedName
如果你想用不同的名字。json
从你的例子来看:
模型
解析
现在,您可以使用gson库进行解析:
梯度进口
请记住在app gradle文件中导入库
模型自动生成
您可以使用这样的在线工具从json自动生成模型。
5jvtdoz215#
快速json解析器非常简单、灵活、快速且可定制。试试看
特征:
符合json规范(rfc4627)
高性能json解析器
支持灵活/可配置的解析方法
任何json层次结构的键/值对的可配置验证
易于使用#占地面积非常小
引发开发人员友好且易于跟踪的异常
可插拔自定义验证支持-可以在遇到时通过配置自定义验证程序来验证密钥/值
验证和非验证解析器支持
支持两种类型的配置(json/xml)以使用快速json验证解析器
需要JDK1.5
不依赖外部库
支持通过对象序列化生成json
在解析过程中支持集合类型选择
它可以这样使用: