2012-08-14 11 views
6

Pracuję nad rozwiązaniem piaskownicy w Sharepoint, ważne ograniczenia (dotyczące tego pytania) z powodu korzystania z .net 3.5 i nie ma dopuszczalnych odbić.Deserializować ciąg znaków JSON w języku C# bez użycia refleksji


PRZYKŁAD 1

Gdy próbuję deserializowania jako JSON ciąg do prostego klasy jak to działa dobrze:

JSON STRING

{"field":"Picture1","url":"whatever"} 

C# CLASS

public class PictureSetting 
{ 
    public string field { get; set; } 
    public string url { get; set; } 
} 

Przykład 2

Ale gdy próbuję deserializowania nieco bardziej złożony ciąg otrzymuję błąd:

JSON STRING

{ 
    "Rows": [ 
    { 
     "Columns": [ 
     { 
      "Width": "100" 
     } 
     ] 
    }  
    ] 
} 

C# KLASY

internal class PageStructure 
{ 
    public List<StructureElement> Rows { get; set; } 
    public PageStructure() 
    { 
     Rows = new List<StructureElement>(); 
    } 
} 

internal class StructureElement 
{ 
    public List<BlockAssigment> Columns { get; set; } 
    public StructureElement() 
    { 
     Columns = new List<BlockAssigment>(); 
    } 
} 

internal class BlockAssigment 
{ 
    public string Width { get; set; } 
} 

ERROR

Wniosek o pozwolenie typu „System.Security.Permissions.ReflectionPermission, mscorlib, Version = 2.0.0.0, Culture = neutral, TokenKluczaPublicznego = b77a5c561934e089 "nie udało się.


* deserializacjia

Kod używam do deserializacji obu przykładów jest tylko standard .net:

var serializer = new JavaScriptSerializer(); 
var obj = serializer.Deserialize<PageStructure>("jsonstring"); 

Wygląda więc na to, że w pierwszym przykładzie .net jest nie za pomocą refleksji, ponieważ to działa. Tak więc pytanie brzmi:

Czy istnieje sposób na deserializację drugiego przykładu bez konieczności .net za pomocą odbicia wewnętrznego?

Modyfikowanie obu ciągów JSON i klas C# nie stanowi problemu, po prostu muszę zachować strukturę (obiekt podstawowy z wierszami włącznie z kolumnami).

Odpowiedz

3

Podejrzewam, że największym problemem jest faktycznie tutaj:

public class PictureSetting // public, works 

kontra

internal class PageStructure // non-public, permission denied 

to brzmi dla mnie jak piaskownicy uniemożliwia refleksję niepublicznych typów/członków. Byłoby to zgodne z większością obszarów izolowanych, na przykład Silverlight: można używać refleksji, ale tylko w przypadku rzeczy, które normalnie byłoby w stanie wykonać - tzn. Uzyskać dostęp do publicznych typów/członków. Spróbuj PageStructure, StructureElement i BlockAssigment do public klas.

+0

Tak, to jest to! Świetnie, dziękuję bardzo! Zmieniłem go na publiczny i działa. Wydaje się więc, że piaskownica NIE przeszkadza ogólnie, ale niepubliczna, jak powiedziałeś. Ciekawy. Każdego dnia uczę się trochę :) – Marc

-1

Możesz użyć tej usługi http://json2csharp.com/ do wygenerowania poprawnych klauzul C# dla parsowania json.

+1

Bardzo fajny link, dzięki! Ale w ogóle nie ma to nic wspólnego z pytaniem ... – Marc

Powiązane problemy