Skip to content

Commit 1f6cb35

Browse files
committed
Avoid using raw get() on JsonObject
get() may return objects with types that are used internally in the nanojson library, such as LazyString or Number. Use specialized methods instead. This commit removes all usages (except in SoundcloudParsingHelper::resolveIdWithWidgetApi()). By doing so, timeago-generator now compiles again, and YoutubeChannelExtractor::getTags() and JsonUtils tests pass again. The compilation and tests failed because nanojson now internally uses LazyString instead of plain String.
1 parent 13c61d3 commit 1f6cb35

File tree

7 files changed

+34
-36
lines changed

7 files changed

+34
-36
lines changed

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeParsingHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public static void collectItemsFrom(final InfoItemsCollector collector,
108108
final boolean sepia) throws ParsingException {
109109
final JsonArray contents;
110110
try {
111-
contents = (JsonArray) JsonUtils.getValue(json, "data");
111+
contents = JsonUtils.getArray(json, "data");
112112
} catch (final Exception e) {
113113
throw new ParsingException("Unable to extract list info", e);
114114
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeStreamExtractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ private void collectStreamsFrom(final StreamInfoItemsCollector collector,
409409
final JsonObject jsonObject) throws ParsingException {
410410
final JsonArray contents;
411411
try {
412-
contents = (JsonArray) JsonUtils.getValue(jsonObject, "data");
412+
contents = JsonUtils.getArray(jsonObject, "data");
413413
} catch (final Exception e) {
414414
throw new ParsingException("Could not extract related videos", e);
415415
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudParsingHelper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.schabi.newpipe.extractor.services.soundcloud.extractors.SoundcloudStreamInfoItemExtractor;
3030
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
3131
import org.schabi.newpipe.extractor.utils.ImageSuffix;
32-
import org.schabi.newpipe.extractor.utils.JsonUtils;
3332
import org.schabi.newpipe.extractor.utils.Parser;
3433
import org.schabi.newpipe.extractor.utils.Parser.RegexException;
3534
import org.schabi.newpipe.extractor.utils.Utils;
@@ -227,7 +226,7 @@ public static String resolveIdWithWidgetApi(final String urlString) throws IOExc
227226
final String response = NewPipe.getDownloader().get(widgetUrl,
228227
SoundCloud.getLocalization()).responseBody();
229228
final JsonObject o = JsonParser.object().from(response);
230-
return String.valueOf(JsonUtils.getValue(o, "id"));
229+
return o.get("id").toString();
231230
} catch (final JsonParserException e) {
232231
throw new ParsingException("Could not parse JSON response", e);
233232
} catch (final ExtractionException e) {

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelTabExtractor.VideosTabExtractor;
4444
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeChannelLinkHandlerFactory;
4545
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeChannelTabLinkHandlerFactory;
46+
import org.schabi.newpipe.extractor.utils.JsonUtils;
4647
import org.schabi.newpipe.extractor.utils.Utils;
4748

4849
import java.io.IOException;
@@ -51,7 +52,6 @@
5152
import java.util.List;
5253
import java.util.Optional;
5354
import java.util.function.Consumer;
54-
import java.util.stream.Collectors;
5555

5656
import javax.annotation.Nonnull;
5757
import javax.annotation.Nullable;
@@ -490,12 +490,7 @@ public List<String> getTags() throws ParsingException {
490490
return List.of();
491491
}
492492

493-
return jsonResponse.getObject("microformat")
494-
.getObject("microformatDataRenderer")
495-
.getArray("tags")
496-
.stream()
497-
.filter(String.class::isInstance)
498-
.map(String.class::cast)
499-
.collect(Collectors.toUnmodifiableList());
493+
return JsonUtils.getStringListFromJsonArray(jsonResponse.getObject("microformat")
494+
.getObject("microformatDataRenderer").getArray("tags"));
500495
}
501496
}

extractor/src/main/java/org/schabi/newpipe/extractor/utils/JsonUtils.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,13 @@ public final class JsonUtils {
2222
private JsonUtils() {
2323
}
2424

25+
/**
26+
* Note that this accesses JsonObject's internal types directly, including LazyString and
27+
* Number. Don't rely on the types of the returned object!
28+
*/
2529
@Nonnull
26-
public static Object getValue(@Nonnull final JsonObject object,
27-
@Nonnull final String path) throws ParsingException {
30+
static Object getValue(@Nonnull final JsonObject object,
31+
@Nonnull final String path) throws ParsingException {
2832

2933
final List<String> keys = Arrays.asList(path.split("\\."));
3034
final JsonObject parentObject = getObject(object, keys.subList(0, keys.size() - 1));
@@ -81,8 +85,12 @@ public static JsonArray getArray(@Nonnull final JsonObject object, @Nonnull fina
8185
return getInstanceOf(object, path, JsonArray.class);
8286
}
8387

88+
/**
89+
* Note that this accesses JsonObject's internal types directly, including LazyString and
90+
* Number. Don't rely on the types of the returned objects!
91+
*/
8492
@Nonnull
85-
public static List<Object> getValues(@Nonnull final JsonArray array, @Nonnull final String path)
93+
static List<Object> getValues(@Nonnull final JsonArray array, @Nonnull final String path)
8694
throws ParsingException {
8795

8896
final List<Object> result = new ArrayList<>();

extractor/src/test/java/org/schabi/newpipe/extractor/utils/JsonUtilsTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import org.junit.jupiter.api.Test;
99
import org.schabi.newpipe.extractor.exceptions.ParsingException;
1010

11-
import java.util.List;
12-
11+
import static org.junit.jupiter.api.Assertions.assertEquals;
1312
import static org.junit.jupiter.api.Assertions.assertTrue;
1413

1514

@@ -18,13 +17,13 @@ public class JsonUtilsTest {
1817
@Test
1918
public void testGetValueFlat() throws JsonParserException, ParsingException {
2019
JsonObject obj = JsonParser.object().from("{\"name\":\"John\",\"age\":30,\"cars\":{\"car1\":\"Ford\",\"car2\":\"BMW\",\"car3\":\"Fiat\"}}");
21-
assertTrue("John".equals(JsonUtils.getValue(obj, "name")));
20+
assertEquals("John", JsonUtils.getValue(obj, "name").toString());
2221
}
2322

2423
@Test
2524
public void testGetValueNested() throws JsonParserException, ParsingException {
2625
JsonObject obj = JsonParser.object().from("{\"name\":\"John\",\"age\":30,\"cars\":{\"car1\":\"Ford\",\"car2\":\"BMW\",\"car3\":\"Fiat\"}}");
27-
assertTrue("BMW".equals(JsonUtils.getValue(obj, "cars.car2")));
26+
assertEquals("BMW", JsonUtils.getValue(obj, "cars.car2").toString());
2827
}
2928

3029
@Test
@@ -38,9 +37,9 @@ public void testGetArray() throws JsonParserException, ParsingException {
3837
public void testGetValues() throws JsonParserException, ParsingException {
3938
JsonObject obj = JsonParser.object().from("{\"id\":\"0001\",\"type\":\"donut\",\"name\":\"Cake\",\"ppu\":0.55,\"batters\":{\"batter\":[{\"id\":\"1001\",\"type\":\"Regular\"},{\"id\":\"1002\",\"type\":\"Chocolate\"},{\"id\":\"1003\",\"type\":\"Blueberry\"},{\"id\":\"1004\",\"type\":\"Devil's Food\"}]},\"topping\":[{\"id\":\"5001\",\"type\":\"None\"},{\"id\":\"5002\",\"type\":\"Glazed\"},{\"id\":\"5005\",\"type\":\"Sugar\"},{\"id\":\"5007\",\"type\":\"Powdered Sugar\"},{\"id\":\"5006\",\"type\":\"Chocolate with Sprinkles\"},{\"id\":\"5003\",\"type\":\"Chocolate\"},{\"id\":\"5004\",\"type\":\"Maple\"}]}");
4039
JsonArray arr = (JsonArray) JsonUtils.getValue(obj, "topping");
41-
List<Object> types = JsonUtils.getValues(arr, "type");
42-
assertTrue(types.contains("Chocolate with Sprinkles"));
43-
40+
assertTrue(
41+
JsonUtils.getValues(arr, "type").stream()
42+
.anyMatch(o -> "Chocolate with Sprinkles".equals(o.toString())));
4443
}
4544

4645
}

timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GeneratePatternClasses.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.Iterator;
1010
import java.util.List;
1111
import java.util.Map;
12-
import java.util.TreeMap;
1312

1413
import com.grack.nanojson.JsonArray;
1514
import com.grack.nanojson.JsonObject;
@@ -21,24 +20,22 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
2120
final InputStream resourceAsStream =
2221
new FileInputStream("timeago-parser/raw/unique_patterns.json");
2322

24-
final JsonObject from = JsonParser.object().from(resourceAsStream);
25-
final TreeMap<String, Object> map = new TreeMap<>(from);
26-
23+
final JsonObject map = JsonParser.object().from(resourceAsStream);
2724
final StringBuilder patternMapEntries = new StringBuilder();
2825

2926
for (Map.Entry<String, Object> entry : map.entrySet()) {
3027
final String languageCode = entry.getKey().replace('-', '_');
31-
final Map<String, Object> unitsList = (Map<String, Object>) entry.getValue();
28+
final JsonObject unitsList = (JsonObject) entry.getValue();
3229

33-
final String wordSeparator = (String) unitsList.get("word_separator");
30+
final String wordSeparator = unitsList.getString("word_separator");
3431

35-
final JsonArray seconds = (JsonArray) unitsList.get("seconds");
36-
final JsonArray minutes = (JsonArray) unitsList.get("minutes");
37-
final JsonArray hours = (JsonArray) unitsList.get("hours");
38-
final JsonArray days = (JsonArray) unitsList.get("days");
39-
final JsonArray weeks = (JsonArray) unitsList.get("weeks");
40-
final JsonArray months = (JsonArray) unitsList.get("months");
41-
final JsonArray years = (JsonArray) unitsList.get("years");
32+
final JsonArray seconds = unitsList.getArray("seconds");
33+
final JsonArray minutes = unitsList.getArray("minutes");
34+
final JsonArray hours = unitsList.getArray("hours");
35+
final JsonArray days = unitsList.getArray("days");
36+
final JsonArray weeks = unitsList.getArray("weeks");
37+
final JsonArray months = unitsList.getArray("months");
38+
final JsonArray years = unitsList.getArray("years");
4239

4340
final StringBuilder specialCasesString = new StringBuilder();
4441
specialCasesConstruct(ChronoUnit.SECONDS, seconds, specialCasesString);
@@ -126,7 +123,7 @@ private static void specialCasesConstruct(ChronoUnit unit, JsonArray array, Stri
126123
final JsonObject caseObject = (JsonObject) o;
127124
for (Map.Entry<String, Object> caseEntry : caseObject.entrySet()) {
128125
final int caseAmount = Integer.parseInt(caseEntry.getKey());
129-
final String caseText = (String) caseEntry.getValue();
126+
final String caseText = caseEntry.getValue().toString();
130127
iterator.remove();
131128

132129
stringBuilder.append(" ")

0 commit comments

Comments
 (0)