Jak napisać json-printer bez korzystania z biblioteki standardowej?

Jak napisać json-printer bez korzystania z biblioteki standardowej?
Cezary Szczepaniak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Jest to warunek konieczny dla uzyskania pozytywnej oceny ze sprawdzianu.

Zabronione jest korzystanie z narzędzi do automatycznej generacji kodu, takich jak ChatGPT, Github Copilot, itp.

Wymagania funkcjonalne
W pliku json_printer.py napisz funkcję printer(obj: JSON) -> str, która konwertuje słownik na napis w formacie JSON.

Zakładamy dowolną strukturę parametru wejściowego, które konwertujemy na napis zgodnie z następującą tabelą:

Kopiuj
Wartość	Napis
None	null
true	True
false	False
int (np. 1)	1
float (np. 1.0)	1.0
str (np. 'abc')	"abc"
list (np. [1, 'A', 3])	[1, "A", 3]
dict (np. {'a': 1, 1: 'B'})	{"a": 1, "1": "B"}

Hint: kluczem słownika JSON jest zawsze napis, więc klucz 1 typu int zostanie zapisany jako "1".

Dodatkowo, dodaj do funkcji dodatkowy parametr opcjonalny indent typu int, który określa ilość spacji wcięcia dla konkretnego poziomu zagnieżdżenia struktury danych. Gdy parametr nie jest podany, napis tworzymy w jednej linii. Gdy parametr jest podany, wcięcia mają być dodane przed każdym elementem listy lub słownika.

Domyślnym separatorem kluczy i wartości dla słowników jest : (dwukropek i spacja), natomiast wartości w liście: , (przecinek i spacja), chyba że warunek wcięć stanowi inaczej.

Przykłady (kropki na początku linii w przykładach symbolizują spacje):

Kopiuj
printer({'a': 1, 'b': 'B'})

powinno zwrócić:

Kopiuj
'{"a": 1, "b": "B"}'
Kopiuj
printer({'a': 1, 'b': 'B'}, indent=2)

powinno zwrócić:

Kopiuj
'{
.."a": 1,
.."b": "B"
}'
Kopiuj
printer({'a': 1, 'b': 'B', 'c': [1, 2, 3]}, indent=2)

powinno zwrócić:

Kopiuj
'{
.."a": 1,
.."b": "B",
.."c": [
....1,
....2,
....3
..]
}' 

mam sprawdzian prosze o szybka pomoc

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6967
3
Cezary Szczepaniak napisał(a):

mam sprawdzian prosze o szybka pomoc

Przygotuj się na poprawkę z tego zadania.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
2

@Cezary Szczepaniak:

mam sprawdzian prosze o szybka pomoc

Pokaż gdzie szukałeś rozwiązania, co i dlaczego nie działało, itd...

Zabronione jest korzystanie z narzędzi do automatycznej generacji kodu, takich jak ChatGPT, Github Copilot, itp.

Ale jak ktoś z nas wrzuci do chata i poda tutaj, to już nie będziesz korzystał z LLma :-D

SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 117
0

dumps.json - coś takiego powinno pomóc ;) A może reversed…

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6967
1

Uwaga chłopaki!!
Długo mi zeszło, bo to bardzo trudne zadanie, ale już mam!

Kopiuj
import re

def printer(jsonDict: dict, indent: int = 0) -> str:
	result = str(jsonDict)
	result = result.replace("'", '"')
	
	if indent < 1:
		return result
	else:
		result = result.replace("{", "{\n" + " " * indent)
		result = result.replace(", ", ",\n" + " " * indent)
		result = result.replace("}", "\n}")
		result = result.replace("[", "[\n" + " " * indent)
		result = result.replace("]", "\n" + " " * indent + "]")
		
		lines = result.splitlines()
		apply_extra_indent = False
		
		for i, line in enumerate(lines):
			if "[" in line:
				apply_extra_indent = True
				continue
				
			if "]" in line:
				apply_extra_indent = False
				
			if apply_extra_indent:
				lines[i] = " " * indent + lines[i]
				
		result = '\n'.join(lines)
		
		return result
		

print(printer({'a': 1, 'b': 'B'}))
print(printer({'a': 1, 'b': 'B'}, indent = 2))
print(printer({'a': 1, 'b': 'B', 'c': [1, 2, 3]}, indent = 2))

Wynik:

Kopiuj
{"a": 1, "b": "B"}
{
  "a": 1,
  "b": "B"
}
{
  "a": 1,
  "b": "B",
  "c": [
    1,
    2,
    3
  ]
}
obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2
Cezary Szczepaniak napisał(a):

Zabronione jest korzystanie z narzędzi do automatycznej generacji kodu, takich jak ChatGPT, Github Copilot, itp.

No tak, AI jest zabronione ale nikt nie napisał że nie można spytać na forum. Jak już ściągasz na sprawdzianie to naprawdę nikt nie odkryje że użyłeś ChatGPT. I tak nie umiałbyś wytłumaczyć działania tego kodu.

mam sprawdzian prosze o szybka pomoc

serio liczyłeś że ktoś napisze ci kod na sprawdzian w ciągu kilkunastu minut i to za darmo?

Cezary Szczepaniak napisał(a):

Jest to warunek konieczny dla uzyskania pozytywnej oceny ze sprawdzianu.

a po co ci ta ocena ze sprawdzianu? Po co w ogóle chodzisz do tej szkoły? Papierek nie da ci później magicznie umięjetności których będziesz potrzebować w pracy. Wygląda jakbyś jedynie marnował czas.

Z ciekawości sprawdziłem co wyplułoby AI:

Kopiuj
def printer(obj, indent=None):
    def convert(value, level=0):
        if value is None:
            return "null"
        elif value is True:
            return "True"
        elif value is False:
            return "False"
        elif isinstance(value, int):
            return str(value)
        elif isinstance(value, float):
            return str(value)
        elif isinstance(value, str):
            return f'"{value}"'
        elif isinstance(value, list):
            items = [convert(item, level + 1) for item in value]
            if indent is not None:
                indent_str = ' ' * indent * (level + 1)
                return f'[\n{indent_str}' + f',\n{indent_str}'.join(items) + f'\n{" " * indent * level}]'
            else:
                return f'[{", ".join(items)}]'
        elif isinstance(value, dict):
            items = [f'{convert(str(k), level + 1)}: {convert(v, level + 1)}' for k, v in value.items()]
            if indent is not None:
                indent_str = ' ' * indent * (level + 1)
                return f'{{\n{indent_str}' + f',\n{indent_str}'.join(items) + f'\n{" " * indent * level}}}'
            else:
                return f'{{{", ".join(items)}}}'
        else:
            raise TypeError(f"Unsupported type: {type(value)}")

    return convert(obj)

# Przykłady użycia:
print(printer({'a': 1, 'b': 'B'}))
print(printer({'a': 1, 'b': 'B'}, indent=2))
print(printer({'a': 1, 'b': 'B', 'c': [1, 2, 3]}, indent=2))

nie sprawdzałem, ale wygląda w porządku

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.