Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/JSON]"Anonieme" JSON-array

Pagina: 1
Acties:

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
Hallo
ik heb een JSON-array die ik als volgt binnenkrijg:
code:
1
["tas", ["tas", "tas", "tasjesdief", "tasjesroof", "tasjesrover", "taskforce", "tassen", "tast", "tastbaar", "tastbaarder"], "", ""]

Ik probeer deze met JSON.Net te deserializen, maar dat loopt fout omwille van het feit dat ik geen name/value-pairs heb. Is het mogelijk om met JSON.Net deze "anonieme" array te deserializen?
Ik vind nergens een oplossing, maar misschien ligt dat aan de vermoeidheid...
PS: mijn code werkt volledig correct met een "echt" JSON-formaat (t.t.z. een degelijke name/value-pair collectie)
Hopelijk heeft iemand een "gouden tip"...
thx!
Evert

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-11 15:12
Hmm jouw JSON array ziet er raar uit : er is maar 1 element wat wederom een array is. Anyways, het lijkt wel valid JSON te zijn als ik hier kijk bijvoorbeeld : http://jsonlint.com/

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hoe wil je het precies hebben in .NET-objecten? Dit is een beetje een vreemde structuur. Je zou sowieso 'raw' moeten kunnen lezen, zonder het om te zetten in objecten. Zie http://james.newtonking.c...ml/ReadingWritingJSON.htm

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Misschien heb je hier wat aan?
http://json.codeplex.com/discussions/359356

  • Camulos
  • Registratie: Januari 2009
  • Laatst online: 17-11 12:35

Camulos

Stampert

.NET en JSON.. dan is de tip: http://json2csharp.com/!

Hiermee genereer je C# classes die je kunt gebruiken icm de Json.net (maar ook JavaScriptSerializer).
Het enige wat er bij jou ontbreekt is dat je het niet in een key-value pair + object hebt gezet

Heb jouw voorbeeld in een object gestopt (voor de key-value pair):
JavaScript:
1
{"object": ["tas", ["tas", "tas", "tasjesdief", "tasjesroof", "tasjesrover", "taskforce", "tassen", "tast", "tastbaar", "tastbaarder"], "", ""]}


en dan rolt dat het volgende uit:
C#:
1
2
3
4
public class RootObject
{
    public List<object> @object { get; set; }
}


Je kan "RootObject" vervangen met een eigen klassenaam. Deze klasse gebruik je vervolgens.
Good Luck!

Not just an innocent bystander


  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Camulos schreef op maandag 24 februari 2014 @ 09:38:
.NET en JSON.. dan is de tip: http://json2csharp.com/!

Hiermee genereer je C# classes die je kunt gebruiken icm de Json.net (maar ook JavaScriptSerializer).
Het enige wat er bij jou ontbreekt is dat je het niet in een key-value pair + object hebt gezet

Heb jouw voorbeeld in een object gestopt (voor de key-value pair):
JavaScript:
1
{"object": ["tas", ["tas", "tas", "tasjesdief", "tasjesroof", "tasjesrover", "taskforce", "tassen", "tast", "tastbaar", "tastbaarder"], "", ""]}


en dan rolt dat het volgende uit:
C#:
1
2
3
4
public class RootObject
{
    public List<object> @object { get; set; }
}


Je kan "RootObject" vervangen met een eigen klassenaam. Deze klasse gebruik je vervolgens.
Good Luck!
Tsja, je kan ook net zo goed meteen Json.NET gebruiken. Zeker wanneer het schema vast staat kan je eenvoudig dynamics gebruiken. Zoals:

C#:
1
2
3
dynamic a = JObject.Parse("input");
var b = a.tas;
var c = a.tas[0];


Buiten alle andere manieren zoals LINQ en SelectToken ;)

'You like a gay cowboy and you look like a gay terrorist.' - James May


  • Camulos
  • Registratie: Januari 2009
  • Laatst online: 17-11 12:35

Camulos

Stampert

@Phyxion: Je hebt gelijk!, jouw manier gaat een stuk vlotter icm met deze simpele structuur :)

(bij complexere structuren kan ik json2csharp zeker wel aanraden :P )

Not just an innocent bystander


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
Bedankt allemaal voor de reacties!
farlane schreef op zondag 23 februari 2014 @ 21:31:
Hmm jouw JSON array ziet er raar uit : er is maar 1 element wat wederom een array is. Anyways, het lijkt wel valid JSON te zijn als ik hier kijk bijvoorbeeld : http://jsonlint.com/
Het is inderdaad raar (vooral door het ontbreken van propertynames), maar dat is nu eenmaal hoe de site het oplevert.
pedorus schreef op zondag 23 februari 2014 @ 21:47:
Hoe wil je het precies hebben in .NET-objecten? Dit is een beetje een vreemde structuur. Je zou sowieso 'raw' moeten kunnen lezen, zonder het om te zetten in objecten. Zie http://james.newtonking.c...ml/ReadingWritingJSON.htm
Ik had deze pagina al gevonden, en heb het nu nog eens doorgelezen, maar zoals je merkt, baseert de site zich op het bestaan van propertynames... wat in mijn situatie net ontbreekt.
Camulos schreef op maandag 24 februari 2014 @ 09:38:Heb jouw voorbeeld in een object gestopt (voor de key-value pair):
JavaScript:
1
{"object": ["tas", ["tas", "tas", "tasjesdief", "tasjesroof", "tasjesrover", "taskforce", "tassen", "tast", "tastbaar", "tastbaarder"], "", ""]}

en dan rolt dat het volgende uit:
C#:
1
2
3
4
public class RootObject
{
    public List<object> @object { get; set; }
}
Je kan "RootObject" vervangen met een eigen klassenaam. Deze klasse gebruik je vervolgens.
Good Luck!
Ik heb al eens (snel-snel) geprobeerd om "mijn" json op deze manier te wrappen, maar dat lukte niet... ik moet echter nog meer testen om een degelijk oordeel te vellen (=op TODO-list voor vanavond ;) )
Phyxion schreef op maandag 24 februari 2014 @ 09:47:
[...]Tsja, je kan ook net zo goed meteen Json.NET gebruiken. Zeker wanneer het schema vast staat kan je eenvoudig dynamics gebruiken. Zoals:
C#:
1
2
3
dynamic a = JObject.Parse("input");
var b = a.tas;
var c = a.tas\[0];
Buiten alle andere manieren zoals LINQ en SelectToken ;)
Als ik naar JObject kijk op deze pagina, dan blijken ook daar toch weer propertynames bij te staan... nog een item voor op de todo-list.

Bedankt al voor jullie input... als ik een oplossing vind, post ik ze zeker hier!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Camulos schreef op maandag 24 februari 2014 @ 10:06:
(bij complexere structuren kan ik json2csharp zeker wel aanraden :P )
In VS2013 (2012 meen ik ook al) heb je onder het menu Edit -> Paste special -> Paste JSON as class (even uit 't hoofd; zoiets is 't). Dan CTRL-C je dus gewoon een zut JSon en plakt VS mooi een class structuur. Hoef je je IDE niet voor te verlaten ;)

Edit: Linkje :Y)

json2csharp gaat overigens al bij de eerste example van die pagina op z'n bek :X

{
"link": "http://www.microsoft.com/Surface/en-US", /*Awesome*/
"virtual": "Virtual Keyboard",
"partial": " The magnesium panels are finished with ... deposition",
"Price": 499.99,
"title": "Microsoft Surface",
"शीर्षक": "माइक्रोसॉफ्ट सरफेस",
"Like": true,
"cdDrive":null,
}


Het 2e voorbeeld maakt 'ie van alles strings...

[ Voor 51% gewijzigd door RobIII op 24-02-2014 18:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Camulos
  • Registratie: Januari 2009
  • Laatst online: 17-11 12:35

Camulos

Stampert

@RobIII: Nice.. wist niet dat VS dit al ingebakken zat! Meteen ff uitproberen :)

Hun eigen voorbeeld is geen valide JSON (volgens JSONlint.com ).
Comments zoals /* Awesome */ staan niet op een valide plaats (sterker nog.. JSON kent helemaal geen comments).. ook de laatste komma is niet al te top.
Escape van special chars gaan natuurlijk ook met een backslash.. rare jongens die van VisualStudio :P Toch wel een mooi feature!

Not just an innocent bystander


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
Heb eindelijk een werkende versie gevonden... omdat ik er nogal van overtuigd ben dat deze geen schoonheidsprijs zal winnen, sta ik absoluut open voor feedback over hoe het beter kan. Meteen ook maar even de probleemstelling wat beter documenteren, want besef dat ook dit beter kan.

Toepassing:
een Windows 8 app rond "Het Groene Boekje"... de woordenlijst komt van woordenlijst.org, meer specifiek van http://woordenlijst.org/gereedschap/suggestions.php?q=...

Probleem:
bij zoeken op bijvoorbeeld de term tas, komt het resultaat als volgt binnen:
code:
1
["tas", ["tas", "tas", "tasjesdief", "tasjesroof", "tasjesrover", "taskforce", "tassen", "tast", "tastbaar", "tastbaarder"], "", ""]
Met andere woorden:
  1. 1e element van de array = zoekterm
  2. 2e element van de array = array met 10 resultaten
  3. 3e element = onbekend
  4. 4e element = idem dito
Het resultaat is door het ontbreken van property names niet ideaal voor JSON-deserialization (wat een term op een maandagavond :+ ).

Oplossing:
(misschien moet ik eerder zeggen work-around)

content bevat de bovenstaande resultaten...
C#:
1
2
3
4
List<object> data = JsonConvert.DeserializeObject<List<object>>(content);
// results are in second item
string[] returnValue = JsonConvert.DeserializeObject<string[]>(data[1].ToString());                   
return returnValue;


Dit levert een stringarray op die ik nadien omzet naar object(en) van de juiste klasse.

Zijn er suggesties? Shoot! ;)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je doet nu input->decode->encode->decode->output, dat kan vast beter/sneller.. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
pedorus schreef op maandag 24 februari 2014 @ 21:42:
Je doet nu input->decode->encode->decode->output, dat kan vast beter/sneller.. ;)
Ik neem aan dat je met die extra "round-trip" het dan hebt over dit statement uit mijn code:
edeboeck schreef op maandag 24 februari 2014 @ 21:29:
C#:
1
string[] returnValue = JsonConvert.DeserializeObject<string[]>(data[1].ToString());
Klopt het dat je dat statement bedoelt?

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Die .ToString() doet zeer waarschijnlijk een encode van iets dat al gedecode was.

Spoiler: Dus uit de losse hand, en compleet ongetest kun je waarschijnlijk gewoon zoiets doen:
C#:
1
return JArray.Parse(content)[1].ToObject<string[]>();

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
pedorus schreef op dinsdag 25 februari 2014 @ 17:54:
Die .ToString() doet zeer waarschijnlijk een encode van iets dat al gedecode was.
die .ToString() gebruik ik omdat data een variabele is van type List<object> (kwestie van de gegevenstypes te balanceren)
pedorus schreef op dinsdag 25 februari 2014 @ 17:54:
Spoiler: Dus uit de losse hand, en compleet ongetest kun je waarschijnlijk gewoon zoiets doen:
C#:
1
return JArray.Parse(content)[1].ToObject<string[]>();
Jouw losse pols geeft alleszins goede resultaten ;) ... THX!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
RobIII schreef op maandag 24 februari 2014 @ 18:26:
[...]

In VS2013 (2012 meen ik ook al) heb je onder het menu Edit -> Paste special -> Paste JSON as class (even uit 't hoofd; zoiets is 't). Dan CTRL-C je dus gewoon een zut JSon en plakt VS mooi een class structuur. Hoef je je IDE niet voor te verlaten ;)
Alleen jammer dat ie niet netjes Pascal cased e.d. Mijn JS code is altijd lower cased, en mn C# code Pascal cased. Ik zie eigenlijk meer in de andere kant op generaten, van .NET classes naar models in je favoriete JS framework. Ik zie dat ook wel gebeuren met AngularJS voor VS2014.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1