• Stars
    star
    320
  • Rank 131,105 (Top 3 %)
  • Language
    Java
  • License
    MIT License
  • Created over 7 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Annotation based HTML to Java parser + Retrofit converter

Maven Central Javadocs

jspoon

jspoon is a Java library that provides parsing HTML into Java objects basing on CSS selectors. It uses jsoup underneath as a HTML parser.

Installation

Insert the following dependency into your project's build.gradle file:

dependencies {
    implementation 'pl.droidsonroids:jspoon:1.3.2'
}

Usage

jspoon works on any class with a default constructor. To make it work you need to annotate fields with @Selector annotation and set a CSS selector as the annotation's value:

class Page {
    @Selector("#title") String title;
    @Selector("li.a") List<Integer> intList;
    @Selector(value = "#image1", attr = "src") String imageSource;
}

Then you can create a HtmlAdapter and use it to build objects:

String htmlContent = "<div>" 
    + "<p id='title'>Title</p>" 
    + "<ul>"
    + "<li class='a'>1</li>"
    + "<li>2</li>"
    + "<li class='a'>3</li>"
    + "</ul>"
    + "<img id='image1' src='image.bmp' />"
    + "</div>";

Jspoon jspoon = Jspoon.create();
HtmlAdapter<Page> htmlAdapter = jspoon.adapter(Page.class);

Page page = htmlAdapter.fromHtml(htmlContent);
//title = "Title"; intList = [1, 3]; imageSource = "image.bmp"

It looks for the first occurrence in HTML and sets its value to a field.

Supported types

@Selector can be applied to any field of the following types (or their primitive equivalents):

  • String
  • Boolean
  • Integer
  • Long
  • Float
  • Double
  • Date
  • BigDecimal
  • Jsoup's Element
  • Any class with default constructor
  • List (or its superclass/superinterface) of supported type

It can also be used with a class, then you don't need to annotate every field inside it.

Attributes

By default, the HTML's textContent value is used on Strings, Dates and numbers. It is possible to use an attribute by setting an attr parameter in the @Selector annotation. You can also use "html" (or "innerHtml") and "outerHtml" as attr's value.

Formatting and regex

Regex can be set up by passing regex parameter to @Selector annotation. Example:

class Page {
    @Selector(value = "#numbers", regex = "([a-z]+),") String matchedNumber;
}

Date format can be set up by passing value parameter to @Format annotation. Example:

class Page {
    @Format(value = "HH:mm:ss dd.MM.yyyy")
    @Selector(value = "#date") Date date;
}
String htmlContent = "<span id='date'>13:30:12 14.07.2017</span>"
    + "<span id='numbers'>ONE, TwO, three,</span>";
Jspoon jspoon = Jspoon.create();
HtmlAdapter<Page> htmlAdapter = jspoon.adapter(Page.class);
Page page = htmlAdapter.fromHtml(htmlContent);//date = Jul 14, 2017 13:30:12; matchedNumber = "three";

Java's Locale is used for parsing Floats, Doubles and Dates. You can override it by setting languageTag @Format parameter:

@Format(languageTag = "pl")
@Selector(value = "div > p > span") Double pi; //3,14 will be parsed 

If jspoon doesn't find a HTML element it wont't set field's value unless you set the defValue parameter:

@Selector(value = "div > p > span", defValue = "NO_TEXT") String text;

Custom converterts

When format or regex is not enough, custom converter can be used to implement parsing from jsoup's Element. This can be done by extending ElementConverter class:

public class JoinChildrenClassConverter implements ElementConverter<String> {
    @Override
    public String convert(Element node, Selector selector) {
        return node.children().stream().map(Element::text).collect(Collectors.joining(", "));
    }
}

And it can be used the following way:

public class Model {
    @Selector(value = "#id", converter = JoinChildrenClassConverter::class)
    String childrenText;
}

Retrofit

Retrofit converter is available here.

Changelog

See GitHub releases

Other libraries/inspirations

  • jsoup - all HTML parsing in jspoon is made by this library
  • webGrude - when I had an idea I found this library. It was the biggest inspiration and I used some ideas from it
  • Moshi - I wanted to make jspoon work with HTML the same way as Moshi works with JSON. I adapted caching mechanism (fields and adapters) from it.
  • jsoup-annotations - similar to jspoon

More Repositories

1

MPParallaxView

Apple TV Parallax effect in Swift.
Swift
1,742
star
2

RxSwiftExamples

Examples and resources for RxSwift.
Swift
966
star
3

flutter-roadmap

Roadmap for Flutter developers in 2020
Dart
430
star
4

Workcation

My Research & Development project I've done at Droids on Roids.
Java
267
star
5

VisionFaceDetection

An example of use a Vision framework for face landmarks detection in iOS 11
Swift
261
star
6

MeasureARKit

An example of measuring app with ARKit in iOS 11
Swift
231
star
7

SwiftCarousel

Lightweight, written natively in Swift, circular UIScrollView.
Swift
143
star
8

Casty

Small Android library that provides a simple media player for Chromecast, fully consistent with Google Cast v3
Java
101
star
9

FlipAnimation-Android

Java
94
star
10

ExampleRealmMVP-Android

Java
66
star
11

GlideSharedTransition

Sample app for Shared Element Transition with Glide
Kotlin
46
star
12

FaceTracking

An example app with AVFoundation camera support and face features tracking
Swift
42
star
13

PageTransformerDemo

Simple example of screen transitions with ViewPager and PageTransformer.
Java
36
star
14

PhotosHelper

Photos Framework in Swift, easiest way.
Swift
35
star
15

let-swift-app

Let Swift Developers Meetup app
Swift
34
star
16

Toast-App

Open source App for TOAST Android developers meetup
Kotlin
34
star
17

android-device-cleaner

Tool for cleaning up Android devices used in QA
Kotlin
28
star
18

android-animation-disabler

Gradle plugin for disabling animations in global settings before UI tests and reenabling them afterwards
Kotlin
27
star
19

SwiftCompressor

SwiftCompressor lets you use Compression framework easily
Shell
24
star
20

RxJavaProductionLine

RxJava example project
Java
23
star
21

StarWarsRosieExample

Example of Rosie framework using The Star Wars API
Java
21
star
22

calculator-unit-and-integration-tests

Java
18
star
23

bitrise-step-flutter

Bitrise step for Flutter
Go
18
star
24

Moya-JASON

JASON bindings for Moya.
Swift
17
star
25

SheetsTranslator

App translation generator using Google Sheets API
Swift
17
star
26

FoQA

Container for Quality Assurance utilities to be included in QA/testing variants of Android apps.
Java
16
star
27

ExampleRealm-Android

Java
11
star
28

mockwebserver-path-dispatcher

A helper for dispatching MockWebServer responses
Kotlin
10
star
29

smoge-flutter

Dart
10
star
30

add-to-google-wallet

Dart
8
star
31

swift-style-guide

Droids on Roids Swift guidelines
8
star
32

SnapchatFiltersView

Snapchat - like swipeable filters for views, photos, videos and live camera preview. Swift.
Shell
8
star
33

StructPersistence

Swift
7
star
34

android-style-guide

Kotlin
7
star
35

BeerApp

Simple introduction to data binding library.
Java
7
star
36

bitrise-step-sonarqube-scanner

Step for running SonarQube Scanner CLI
Shell
6
star
37

multi-window-drop-adjacent

Java
6
star
38

ChartsDemo

Charts demo
Swift
5
star
39

Habit

An easy-to-use library to make repeated notifications simpler
Shell
4
star
40

bitrise-step-openstf-connect

Bitrise step for Open STF devices connection
Go
4
star
41

multi-window-catch

Java
4
star
42

modeltesting

Sample project for blog post
Java
4
star
43

bitrise-step-trigger-bitrise-workflow

Bitrise step for triggering workflow on bitrise.io with specified parameters
Go
4
star
44

MazeSpriteKit

Maze Game with SpriteKit demo
Swift
4
star
45

auth0_rs256_jwt_verifier

Ruby gem for verifying Auth0 API JWT access tokens signed using RS256 algorithm.
Ruby
4
star
46

swift-vs-objc

Swift vs Obj-C performance comparision
Objective-C
4
star
47

fluttrise

Unofficial Bitrise.io client made with Flutter.
Dart
3
star
48

android-font-binder

Annotation-based typeface binding to TextViews
Kotlin
3
star
49

GCMSender

Push notifications sender for Google Cloud Messaging
Swift
3
star
50

SwiftyRouter

SwiftyRouter makes it easy to deal with network connection in Swift
Swift
3
star
51

PlanningPoker-Android

Java
2
star
52

bitrise_set_jira_features

Feature list as jira links to insert in release notes
Shell
2
star
53

TracepathAndroid

C
2
star
54

toast7-hackme

Hackme application for Toast #7
Java
2
star
55

bitrise_step_build_info_jira_comment

Shell
2
star
56

EstimoteBeaconsDemo

The simplest of the simplest examples
Java
2
star
57

android-gradle-aosp-aapt-plugin

Gradle plugin which sets aaptConfig.additional parameters based on environment variables defined by AOSP build system
Groovy
2
star
58

constraint-layout-charts

Java
2
star
59

MemoryLeaksExample

Java
2
star
60

android-runtime-permission-tock-too

Example of Time Of Check To Time Of Use race condition on Android
Kotlin
2
star
61

3DTouchExample

Example of all kinds of 3D Touch support written in Swift 3.0
Swift
2
star
62

compose-guidelines

2
star
63

TwitterLogIn

Swift
1
star
64

homebrew-tools

Ruby
1
star
65

B-VIPER-module-template

Swift
1
star
66

TouchID_swift

Swift
1
star
67

RealmToDo

To-do app with Realm
Swift
1
star
68

flutter-events

Flutter events app
Dart
1
star
69

DORSidebar

Purely Swift sidebar menu
Swift
1
star
70

Unit-and-Integration-Tests-for-Android

Java
1
star
71

DroidsMap

Kotlin
1
star
72

DORDoneHUD

Done animation in Objective-C
Objective-C
1
star
73

HoloGraphLibrary

Fork of HoloGraphLibrary by Daniel Nadeau https://bitbucket.org/danielnadeau/holographlibrary
Java
1
star
74

bitrise-step-chuck-norris

Bitrise step for adding jokes about Chuck Norris to build log
Go
1
star
75

bitrise-step-publish-spoon-results

Bitrise step for publishing Spoon tests results on Github pages
Shell
1
star
76

svg-optimizer

C++
1
star
77

snakeyaml

snakeyaml fork with FIELD bean access
Java
1
star
78

android-aop-demo

AOP demo app
Java
1
star
79

bitrise-step-update-jira-issue-field

Bitrise step for updating JIRA issue fields
Go
1
star
80

DORUIKitDynamics

Sample UIKitDynamics, presented by one of ours iOS Developers
Swift
1
star
81

HipChatGerritHooks

Gerrit hooks sending notifications to HipChat
Python
1
star