2016-03-23 3 views
1

я в беде с этим: JSONНе удается создать правильный класс

{ 
"tester": [ 
    { 
     "type": { 
     "ID": "R89d", 
     "Description": "Test", 
     "lastUpdated": "2016-03-20 20:45:09", 
     }, 
     "specification": {} 
    }, 
    { 
     "type": { 
     "ID": "RB01", 
     "Description": "Another test", 
     "lastUpdated": null 
     }, 
     "specification": { 
     "0": { 
      "ID": "RB01", 
      "number": 1, 
      "Type": "RB" 
     }, 
     "1": { 
      "ID": "RB01", 
      "number": 3, 
      "Type": "RB" 
     } 
     } 
    }, 
    { 
     "type": { 
     "ID": "RT40", 
     "Description": "Test 2", 
     "lastUpdated": null, 
     }, 
     "specification": {} 
    } 
    ] 
} 

, в частности, когда я положил его в json2c# сайт я получил этот класс:

public class Type 
{ 
    public string ID { get; set; } 
    public string Description { get; set; } 
    public string lastUpdated { get; set; } 
} 

public class __invalid_type__0 
{ 
    public string ID { get; set; } 
    public int number { get; set; } 
    public string Type { get; set; } 
} 

public class __invalid_type__1 
{ 
    public string ID { get; set; } 
    public int number { get; set; } 
    public string Type { get; set; } 
} 

public class Specification 
{ 
    public __invalid_type__0 __invalid_name__0 { get; set; } 
    public __invalid_type__1 __invalid_name__1 { get; set; } 
} 

public class Tester 
{ 
    public Type type { get; set; } 
    public Specification specification { get; set; } 
} 

public class RootObject 
{ 
    public List<Tester> tester { get; set; } 
} 

Я DON» я знаю, почему сайт вернет мне invalid type, потому что синтаксис json правильный. Моя цель - создать класс, который позволит мне читать все свойства specification, как вы можете видеть в json массив массивов. Мне нужно сделать что-то, что позволит мне получить доступ ко всем значениям specification как ID - Number - Type. На самом деле мне это удалось только с типом с чем-то вроде этого:

string responseText = "json above"; 
var obj = JsonConvert.DeserializeObject<RootObject>(responseText); 

foreach(var item in obj.Tester){ //loop through Tester item 
    //what I need: 

    foreach(var spec in item.specification){ //not possible 
     spec.Description; ... 
    } 
} 
+1

Хотя JSON синтаксис правильный, это не значит, что он может создать для него допустимый тип C#. JSON, который вы опубликовали, приведет к именам свойств '0' и' 1', которые недопустимы. Есть ли вероятность, что вы можете переделать свой вывод JSON на то, что является массивом _actual_, а не быть объектом с подобными массиву свойствами? Несмотря на то, что вы сможете провести время для десериализации этого в некотором роде, более быстрый и понятный подход может помочь исправить исходный код. –

+0

Также 'type' кажется проблематичным с учетом текущего класса' Type'. –

+0

@JamesThorpe Я могу удалить только '' 0 "и' "1". Я не знаю, может ли это редактирование помочь. Это: http://pastebin.com/LXPzrmjJ – Dillinger

ответ

2

Проблема здесь:

"specification": { 
     "0": { 
      "ID": "RB01", 
      "number": 1, 
      "Type": "RB" 
     }, 
     "1": { 
      "ID": "RB01", 
      "number": 3, 
      "Type": "RB" 
     } 

В C# имена не могут начинаться с цифры. Генератор не может назвать тип "0" и "1"

EDIT

Если вы можете изменить JSON затем изменить его таким образом:

"specification": [ 
     { 
      "ID": "RB01", 
      "number": 1, 
      "Type": "RB" 
     }, 
     { 
      "ID": "RB01", 
      "number": 3, 
      "Type": "RB" 
     } 
     ] 

Меняем массиву дать такую ​​структуру:

public class Type 
{ 
    public string ID { get; set; } 
    public string Description { get; set; } 
    public string lastUpdated { get; set; } 
} 

public class Specification 
{ 
    public string ID { get; set; } 
    public int number { get; set; } 
    public string Type { get; set; } 
} 

public class Tester 
{ 
    public Type type { get; set; } 
    public List<Specification> specification { get; set; } 
} 

public class RootObject 
{ 
    public List<Tester> tester { get; set; } 
} 
+0

, поэтому я должен изменить структуру json? Что вы предлагаете? Если я удалю цифру: http://pastebin.com/LXPzrmjJ – Dillinger

+0

Вам нужно исправить, как создается ваш выходной объект JSON. @BWA - это правильно. – Kixoka

+0

@Kixoka Посмотрите мой pastebin, я меняю структуру json, удаляя цифру, может быть, может помочь решить проблему. – Dillinger

1
public class Type 
{ 
    public string ID { get; set; } 
    public string Description { get; set; } 
    public string lastUpdated { get; set; } 
} 

public class Specification 
{ 
    public string ID { get; set; } 
    public int number { get; set; } 
    public string Type { get; set; } 
} 

public class Tester 
{ 
    public Type[] types { get; set; } 
    public Specification[] specifications { get; set; } 
} 

public class RootObject 
{ 
    public List<Tester> tester { get; set; } 
} 
1

specification должен быть массивом:

"specification": [ 
    { 
     "ID": "RB01", 
     "number": 1, 
     "Type": "RB" 
    }, 
    .... 
] 

и c# реализация тоже:

public class Tester 
{ 
    public Type type { get; set; } 
    public Specification[] specification { get; set; } 
} 

или List<Specification>:

public class Tester 
{ 
    public Type type { get; set; } 
    public List<Specification> specification { get; set; } 
} 

и Specification сам:

public class Specification 
{ 
    public string ID { get; set; } 
    public int number { get; set; } 
    public string Type { get; set; } 
} 
+0

Infact Я изменил свой json вот так: http://pastebin.com/LXPzrmjJ Я попробую ваше решение – Dillinger

Смежные вопросы