2016-04-04 8 views
0

Мне было интересно, как я мог в лучшем случае десериализовать эту строку json. Для этого я использую Newtonsoft.json как плагин с Xamarin.Каков наилучший способ desirialize этой строки json?

Мне нужны только части, которые говорят «транзакция» и массив в нем «транзакции» в списке.

{ 
    "id": 999, 
    "transactions": [ 
    { 
     "order": 1, 
     "displayName": "01_lgn", 
     "transaction": { 
     "id": 7791, 
     "name": "01_lgn", 
     "description": null, 
     "warning": 1, 
     "poor": 2, 
     "timeOut": 45, 
     "tolerated": 3, 
     "frustrated": 7, 
     "state": 1, 
     "includeInThroughputCalculation": true 
     } 
    } 
    { 
     "order": 2, 
     "displayName": "02", 
     "transaction": { 
     "id": 7793, 
     "name": "02", 
     "description": null, 
     "warning": 1, 
     "poor": 2, 
     "timeOut": 45, 
     "tolerated": 3, 
     "frustrated": 7, 
     "state": 1, 
     "includeInThroughputCalculation": true 
     } 
    } 
    ], 
    "defies": null, 
    "state": 1, 
    "reportDisplayName": "testSomething" 
} 

Что я уже пробовал - это поместить его в строго типизированный класс, а затем составить его список.

public class testTransaction 
    { 
     [JsonProperty("id")] 
     public int Id { get; set; } 

     [JsonProperty("state")] 
     public int State { get; set; } 

     [JsonProperty("reportDisplayName")] 
     public string ReportDisplayName { get; set; } 

     [JsonProperty("transactions")] 
     public List<testTransactions> testTransactions { get; set; } 
    } 

public class testTransactions 
    { 
     [JsonProperty("id")] 
     public int Id { get; set; } 

     [JsonProperty("name")] 
     public string Name { get; set; } 

     [JsonProperty("description")] 
     public object Description { get; set; } 

     [JsonProperty("warning")] 
     public int Warning { get; set; } 

     [JsonProperty("poor")] 
     public int Poor { get; set; } 

     [JsonProperty("timeOut")] 
     public int TimeOut { get; set; } 

     [JsonProperty("tolerated")] 
     public int Tolerated { get; set; } 

     [JsonProperty("frustrated")] 
     public int Frustrated { get; set; } 

     [JsonProperty("state")] 
     public int State { get; set; } 

     [JsonProperty("includeInThroughputCalculation")] 
     public bool IncludeInThroughputCalculation { get; set; } 
    } 

Но когда я пытаюсь десериализации его таким образом «SEARCHRESULT» пусто, и я вижу, что ничего не добавляется в список.

var bleh = jsonstring; 
JObject parsedketenObject = JObject.Parse(bleh); 
IList<JToken> jTokenResults1 = parsedketenObject; 
IList<JToken> jTokenResults2 = parsedketenObject ["transactions"].Children().ToList(); 
IList<JToken> jTokenResults3 = parsedketenObject["transactions"][0]["transaction"].Children().ToList(); 
_Transactions_list = new List<testTransaction>(); 

foreach (JToken result in jTokenResults2) 
{ 
    testTransaction searchResult = JsonConvert.DeserializeObject<testTransaction>(result.ToString()); 
    _Transactions_list.Add(searchResult); 
} 

ответ

2

Во-первых, JSON, кажется, неправильный формат, вам не хватает запятой.

{ 
    "id": 999, 
    "transactions": [ 
    { 
     "order": 1, 
     "displayName": "01_lgn", 
     "transaction": { 
     "id": 7791, 
     "name": "01_lgn", 
     "description": null, 
     "warning": 1, 
     "poor": 2, 
     "timeOut": 45, 
     "tolerated": 3, 
     "frustrated": 7, 
     "state": 1, 
     "includeInThroughputCalculation": true 
     } 
    }, <-------- HERE 
    { 
     "order": 2, 
     "displayName": "02", 
     "transaction": { 
     "id": 7793, 
     "name": "02", 
     "description": null, 
     "warning": 1, 
     "poor": 2, 
     "timeOut": 45, 
     "tolerated": 3, 
     "frustrated": 7, 
     "state": 1, 
     "includeInThroughputCalculation": true 
     } 
    } 
    ], 
    "defies": null, 
    "state": 1, 
    "reportDisplayName": "testSomething" 
} 

Кроме того, попробуйте это для POCO вместо:

public class TransactionDetails 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public object description { get; set; } 
    public int warning { get; set; } 
    public int poor { get; set; } 
    public int timeOut { get; set; } 
    public int tolerated { get; set; } 
    public int frustrated { get; set; } 
    public int state { get; set; } 
    public bool includeInThroughputCalculation { get; set; } 
} 

public class Transaction 
{ 
    public int order { get; set; } 
    public string displayName { get; set; } 
    public TransactionDetails transaction { get; set; } 
} 

public class RootObject 
{ 
    public int id { get; set; } 
    public List<Transaction> transactions { get; set; } 
    public object defies { get; set; } 
    public int state { get; set; } 
    public string reportDisplayName { get; set; } 
} 

Затем вы можете использовать

var x = JsonConvert.DeserializeObject<RootObject>(blah); 

х будет содержать transactions, который уже список.

+0

Спасибо, что вы прокомментировали мое сообщение и что вы готовы мне помочь. Я только что связал ваш код, и я думаю, что я где-то получаю, но на данный момент я получил это сообщение об ошибке из Newtonsoft.json.jsonReadException. «Входная строка« 1.0 »не является допустимым целым. Транзакции« [»] .transaction .warning ', строка 1, позиция 496. " Может быть, что-то не так в Сильно типизированном классе? @Blueberry –

+0

Нет проблем. Дважды проверьте, что строка JSON фактически равна 1, а не 1.0. Вы можете попробовать изменить тип предупреждения в классе TransactionDetails на двойную или четную строку в зависимости от вашего использования. – Blueberry

+0

Еще раз спасибо. Он работает сейчас. Некоторые целые числа должны были быть строками. Но у меня есть последний вопрос. Может быть, вы можете мне помочь. Как я могу теперь показать значение x в UITableViewController? @Blueberry –

-2

Лучший способ сериализации/десериализации json-строки для json-объекта - это использование библиотеки Google Gson. Вы должны создать файлы DTO и использовать его тип для сериализации строки. Документацию можно найти здесь: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html

+0

Предлагая библиотеку java для вопроса с тегами C#, это не так полезно – Jason

0

Этот метод не сильно типизированных, но он будет работать:

var jsonString = GetTheJson(); // however you get your json 

dynamic jsonObject = JsonConvert.DeserializeObject(jsonString); 
foreach (var txn in jsonObject.transactions) 
{ 
    Console.WriteLine("{0} {1} {2}", txn.order, txn.displayName, txn.transaction.id); 
}