2011-12-05 19 views
7

Coś mnie dręczy. Użyłem JSON w kilku moich aplikacjach/stronach internetowych, wszyscy to uwielbiamy! Jednak coś weszło głowę dzisiaj który nigdy nie myślał o .. spojrzeć na poniższym przykładzie (ten pochodzi z http://json.org/example.html):Zrozumienie struktury JSON - atrybuty i wartości

{"widget": { 
    "debug": "on", 
    "window": { 
     "title": "Sample Konfabulator Widget", 
     "name": "main_window", 
     "width": 500, 
     "height": 500 
    }, 
    "image": { 
     "src": "Images/Sun.png", 
     "name": "sun1", 
     "hOffset": 250, 
     "vOffset": 250, 
     "alignment": "center" 
    }, 
    "text": { 
     "data": "Click Here", 
     "size": 36, 
     "style": "bold", 
     "name": "text1", 
     "hOffset": 250, 
     "vOffset": 100, 
     "alignment": "center", 
     "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 
}} 

teraz jeśli ta została wyrażona jako XML: musielibyśmy następujący :

<widget> 
    <debug>on</debug> 
    <window title="Sample Konfabulator Widget"> 
     <name>main_window</name> 
     <width>500</width> 
     <height>500</height> 
    </window> 
    <image src="Images/Sun.png" name="sun1"> 
     <hOffset>250</hOffset> 
     <vOffset>250</vOffset> 
     <alignment>center</alignment> 
    </image> 
    <text data="Click Here" size="36" style="bold"> 
     <name>text1</name> 
     <hOffset>250</hOffset> 
     <vOffset>100</vOffset> 
     <alignment>center</alignment> 
     <onMouseUp> 
      sun1.opacity = (sun1.opacity/100) * 90; 
     </onMouseUp> 
    </text> 
</widget> 

patrząc na JSON do przekształcenia XML Zastanawiam się, czy istnieje jakikolwiek sposób, że można rozróżnić, czy para („klucz”: „wartość”) stanowią atrybut znacznika. Na przykład, w naszym JSON powyżej

"window": { 
      "title": "Sample Konfabulator Widget", 
      "name": "main_window", 

tytułem jest reprezentowany jako atrybut znacznika okna podczas gdy nazwa jest tag w jego własnym prawem, jednak nie jest to wyrażone w dowolnym miejscu (to widzę).

<window title="Sample Konfabulator Widget"> 
    <name>main_window</name> 

Dlaczego nie jest to wyświetlany jako:

<window> 
    <title>Sample Konfabulator Widget</title> 
    <name>main_window</name> 

jest ich sposób mogę określić, czy para jest atrybutem znacznika macierzystego lub znacznik dzieci w ich własnym prawem? Przepraszam, jeśli moje sformułowanie jest złe lub nie wyjaśniam się dobrze.

+1

Czy masz schemat XML lub coś? Ani XML, ani JSON nie przypisują twojemu danym semantycznego znaczenia. –

+3

Najpopularniejszą konwencją, jaką widziałem w wielu transformatorach xml-json jest uzyskanie atrybutów zaczynających się od @ w jsonie. eg: '{" window ": {" @title ": ...' – Mic

+0

@Mic - To dobry sposób na zrobienie tego. Nigdy wcześniej tego nie widziałem, ale twoje jedno zdanie wyjaśnia, jak to działa. – nnnnnn

Odpowiedz

1

Niektóre konwertery używają domyślnych słów kluczowych, takich jak "tytuł" i "src", które są przekształcane jako atrybut zamiast pola. Niektóre konwertery nie.

+0

Cieszę się, że ludzie nadal myślą ... _Myślę, że jakiś punkt odniesienia dla twojej myśli byłby świetny , więc mógłbym wiedzieć, czy narzędzie to robi (= w oparciu o jaką specyfikację) – Philzen

1

Nie w ramach JSON. Zakładam, że użyłeś jakiegoś automatycznego sposobu konwersji na XML z JSON; w zależności od programu, który wykonuje transformację, mogą istnieć adnotacje, których możesz użyć. Zobacz także np. http://en.wikipedia.org/wiki/JSON, która daje dwa przykłady XML dla tego samego JSON.

Nie ma formalnej specyfikacji (o której mi wiadomo), jak "należy" mapować JSON na XML. Oba są sformalizowanymi, uporządkowanymi sposobami reprezentowania danych, ale pozostawiają konkretne części tego, jak reprezentujesz dane. Zależy więc od tego, jak chcesz reprezentować dane i od tego, z czym Twoja aplikacja może lub nie może sobie poradzić.

2

To zależy od konwertera.

Json nie pasuje do XML 1-1.

Po prostu, json jest po prostu sposobem na reprezentowanie słownikowo i tablicowo zagnieżdżonych.

0

Właśnie przeczytałem ten dokładny przykład na stronie json i pomyślałem: "jak na ziemi jest tytuł, atrybutem, nie ma nic, co by to oznaczało." Zakładam, że sam przykład nie jest zły - ale nie wiem, dlaczego ktokolwiek nie oferuje prostej odpowiedzi?

2

Niektórzy ludzie używają zwykłej właściwości o nazwie "@attributes", nadając jej specjalne znaczenie "container attributes", ale ta nazwa nie ma specjalnego znaczenia dla specyfikacji JSON

Aby odpowiedzieć na twoje pytanie, nie ma sposobu na odróżnienie par "klucz": "wartość" i atrybuty, po prostu dlatego, że json nie obsługuje atrybutów

Tego rodzaju pytanie zwykle pochodzi od osób, które zapominają, że M w XML oznacza "znacznik", który jest sposobem na przyjmowanie zwykłego tekstu i dodawanie znaczników do tworzenia tekstu strukturalnego. Przypuszczam, że nieporozumienie przyzwala na promowanie JSON jako a fat-free alternative to XML, podczas gdy w rzeczywistości XML jest językiem znaczników, a JSON jest formatem wymiany danych. Nikt nie jest tak naprawdę alternatywą dla drugiego.

Mieszana zawartość to jeden z kontekstów, w których XML pokazuje moc.

<p>What a <b>mess</b> we're in.</p> 

Próbując wyrazić to jako JSON, zdasz sobie sprawę, że nie został on zaprojektowany do tej pracy.

Z drugiej strony, XML może być bardzo przydatny jako element wymiany danych, ale nie jest to tym, do czego został zaprojektowany lub gdzie są jego główne atuty.

0

Myślę, że jest to (nieco) traktowane w tym "tytuł" i "opis" (i "domyślne") są uważane za słowa kluczowe w JSON. JSON tak naprawdę nie obsługuje atrybutów. Myślę, że jedynym sposobem na zrobienie tego byłoby dodanie kolejnego obiektu enkapsulacji w celu oddzielenia "tytułu" od innych wpisów. Sądzę, że wysiłek JSON-a polegający na stworzeniu "tytułu" i "opisu" jest wysiłkiem, aby sobie z tym poradzić. (Nie jest to wspaniała odpowiedź, wiem ....)

https://spacetelescope.github.io/understanding-json-schema/reference/generic.html

0

Obiekt „title” w „widget/oknie” zostanie wygenerowany do nowego elementu. Nigdy nie przejdzie do atrybutu innego elementu. Bardzo o tym wiem.

+0

Nie jestem pewien, czy to naprawdę * odpowiada * na pytanie. Raczej czyta się jak komentarz, który daje trochę informacji, ale niewiele więcej. – GhostCat