想要使用这一串json的最佳方法是什么?

时间:2016-04-04 15:13:10

标签: c# ios json xamarin

我想知道我怎么能最好反序列化这个json字符串。为此,我使用Newtonsoft.json作为Xamarin的插件。

我只需要说" transaction"和其中的数组"交易"在列表中。

{
  "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; }
    }

但是当我尝试以这种方式反序列化时,&#34; searchResult&#34;是空的,我看到列表中没有添加任何内容。

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);
}

3 个答案:

答案 0 :(得分: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);

x将包含transactions,它已经是一个列表。

答案 1 :(得分: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);
}

答案 2 :(得分:-2)

将json字符串序列化/反序列化为json对象的最佳方法是使用Google Gson库。您应该创建DTO文件并使用其类型来序列化字符串。 可以在此处找到文档:https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html