this post was submitted on 30 Jun 2024
284 points (94.9% liked)

Programmer Humor

19721 readers
68 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 1 year ago
MODERATORS
 

Meme transcription: Panel 1. Two images of JSON, one is the empty object, one is an object in which the key name maps to the value null. Caption: “Corporate needs you to find the difference between this picture and this picture”

Panel 2. The Java backend dev answers, “They’re the same picture.”

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 15 points 5 months ago (5 children)

Thanks for the transcription!

Surely Java can tell the difference between a key with a null value and the absence of that key, no?

I mean, you can set up your deserialization to handle nulls in different ways, but a string to object dictionary would capture this, right?

[–] [email protected] 18 points 5 months ago

Sure, Java can tell the difference. But that doesn’t mean that the guy writing the API cares whether or not he adds a key to the dictionary before yeeting it to the client.

[–] [email protected] 7 points 5 months ago* (last edited 5 months ago)

Kinda, I guess we all can agree it’s more typical to deserialize into POJO where theres is no such thing as missing field. Otherwise why would you choose Java if you don’t use types. This great precondition for various stupid hacks to achieve „patching” resources, like blank strings or negative numbers for positive-only fields or even Optional as a field.

[–] [email protected] 3 points 5 months ago

You can always bind the JSON to a hashmap implementation, as that’s all JSON is anyway. It’s not pretty but it works.

[–] [email protected] 2 points 5 months ago (1 children)

It can, but especially during serialization Java sometimes adds null references to null values.

That's usually a mistake by the API designer and/or Java dev, but happens pretty often.

[–] [email protected] 3 points 5 months ago (1 children)

That’s the thing though, isn’t it? The devs on either side are entering into a contract (the API) that addresses this issue, even if by omission. Whoever breaks the contract must rightfully be ejected into the stratosphere.

[–] [email protected] 0 points 5 months ago (2 children)

That's exactly not the thing, because nobody broke the contract, they simply interpret it differently in details.

Having a null reference is perfectly valid json, as long as it's not explicitly prohibited. Null just says "nothing in here" and that's exactly what an omission also communicates.

The difference is just whether you treat implicit and explicit non-existence differently. And neither interpretation is wrong per contract.

[–] [email protected] 8 points 5 months ago

I think we’re fully in agreement here: if the API doesn’t specify how to handle null values, that omission means they’re perfectly valid and expected.

Imagine a delivery company’s van exploding if somebody attempts to ship an empty box. That would be a very poorly built van.

[–] [email protected] 3 points 4 months ago (2 children)

Null means I'm telling you it's null.

Omission means it's not there and I'm not telling you anything about it.

There is a world of difference between those two statements. It's the difference between telling someone you're single or just sitting there and saying nothing.

[–] JackbyDev 1 points 4 months ago (1 children)

I (think, at least) the point they're making is that unless the API contract specifically differentiates between "present and null" and "absent" then there is no difference. (Specifically for field values.)

[–] [email protected] 0 points 4 months ago

The point I'm making is kind of the opposite, unless the contract explicitly states that they're the same they should not be treated as the same, because at a fundamental level they are not the same thing even if Java wants to treat them as such.

[–] [email protected] -2 points 4 months ago (1 children)

Nope.

If there's a clear definition that there can be something, implicit and explicit omission are equivalent. And that's exactly the case we're talking about here.

[–] [email protected] 0 points 4 months ago* (last edited 4 months ago) (1 children)

Sure, in a specific scenario where you decide they're equivalent they are, congratulations. They're not generally.

[–] [email protected] 0 points 4 months ago (1 children)

Did you read the comments above?

You can't just ignore context and proclaim some universal truth, which just happens to be your opinion.

[–] [email protected] 1 points 4 months ago (2 children)

At the (SQL) database level, if you are using null in any sane way, it means "this value exists but is unknown". Conflating that with "this value does not exist" is very dangerous. JavaScript, the closest thing there is to a reference implementation for json serialization, drops attributes set to undefined, but preserves null. You seem to be insisting that null only means "explicit omission", but that isn't the case. Null means a variety of subtly different things in different contexts. It's perfectly fine to explicitly define null and missing as equivalent in any given protocol, but assuming it is not.

[–] [email protected] 1 points 4 months ago

At the (SQL) database level, if you are using null in any sane way, it means "this value exists but is unknown".

Null at the SQL means that the value isn't there, idk where you're getting that from. SQL doesn't have anything like JS's undefined, there's no other way to represent a missing value in sql other than null (you could technically decide on certain values for certain types, like an empty string, but that's not something SQL defines).

[–] [email protected] 1 points 4 months ago (1 children)

Again, did you actually read the comments?

Is SQL an API contract using JSON? I hardly think so.

Java does not distinguish between null and non-existence within an API contract. Neither does Python. JS is the weird one here for having two different identifiers.

Why are you so hellbent on proving something universal that doesn't apply for the case specified above? Seriously, you're the "well, ackshually" meme in person. You are unable or unwilling to distinguish between abstract and concrete. And that makes you pretty bad engineers.

[–] [email protected] -1 points 4 months ago

If your SQL model has nulls, and you don't have some clear way to conserve them throughout the data chain, including to the json schema in your API contract, you have a bug. That way to preserve them doesn't have to be keeping nulls distinct from missing values in the json schema, but it's certainly the most straightforward way.

The world has more than three languages, and the way Java and Python do things is not universally correct. I'm not up to date on either of them, but I'm also guessing that they both have multiple libraries for (de) serialization and for API contract validation, so I am not really convinced your claims are universal even within those languages.

I am not the other person you were talking to, I've only made one comment on this, so not really "hellbent", friend.

Yes, I am pretty sure I read the comments, although you're making me wonder if I'm missing one. What specific comment, what "case specified above" are you referring to? As far as I can see, you are the one trying to say that if a distinction between null and a non-existent attribute is not specified, it should universally be assumed to be meaningless and fine to drop null values. I don't see any context that changes that. If you can point it out, specifically, I'll be glad to reassess.

[–] Nithanim 1 points 4 months ago

Java does not have the concept of "undefined", only "null". Also, json handling is only done via libraries so it also depends on what reads it. If the programmer defines the property as its type directly (here string), then the library reading has no way to convey the distinction between undefined or null. Either it uses null or throws. The jackson library can understand when the type is Optional. So the field would be null when undefined and an empty optional when null.