【问题标题】:How parse complex json with property d如何解析具有属性 d 的复杂 json
【发布时间】:2014-04-29 16:25:04
【问题描述】:

我在 windows phone 8 中使用 C# 反序列化 JSON 时遇到问题,请帮我解决:-

这是我得到的 JSON 结果:-

{"d":"{\"TickTime\":\"29/04/2014 19:13:41\",\"符号\":[{\"I\":61,\"H \":0.8551,\"L\":0.8516,\"A\":0.855,\"B\":0.8545},{\"I\":62,\"H\":1301.4,\"L \":1286.3,\"A\":1296.6,\"B\":1296.4}]}"}

这是我使用的类:-

public class OuterRootObject
{
public string d { get; set; }
}


public class RootObject
{

public DateTime TickTime { get; set; }
public List<Symbols> Symbols{ get; set; }
 }

public class Result
{
public int I { get; set; }
public double A { get; set; }
public double B { get; set; }
public double H { get; set; }
public double L{ get; set;
} 

我已使用此代码对 JSON 进行反序列化,但它不起作用,因为内部外部根结果是时间值和符号数组,我不知道如何同时解析它们。

var outerRoot = JsonConvert.DeserializeObject<OuterRootObject>(My JSON);
var root = JsonConvert.DeserializeObject<RootObject>(outerRoot.d);

【问题讨论】:

  • Symbols 类是什么样的?
  • 它的数组列表 :( 它的复杂我不知道如何去除它
  • 由于您在一小时前的编辑,我将重新打开。这确实试图提供有关您尝试过的内容以及您认为它不起作用的原因的信息。现在也许有人可以回答了。

标签: c# json windows-phone-7 windows-phone-8 json.net


【解决方案1】:

这个工作 100% 只是改变

public DateTime TickTime { get; set; }

public string TickTime { get; set; }

然后使用它来反序列化您的 JSON

var outerRoot = JsonConvert.DeserializeObject<OuterRootObject>(your JSON);
var root = JsonConvert.DeserializeObject<RootObject>(outerRoot.d);



                             foreach (var SymbolsInfo in root.Symbols)
                             {
                                 var i = SymbolsInfo .I;
                                 var a = SymbolsInfo .A;
                                 var b = SymbolsInfo .B;
                                 var l = SymbolsInfo .L;
                                 var h = SymbolsInfo .H;
                             }

【讨论】:

    【解决方案2】:

    我能够让您的代码进行两项更改。

    1. 我将Symbols 属性更改为包含List&lt;Result&gt; 而不是List&lt;Symbols&gt;,因为您没有定义我可以看到的Symbols 类,而Result 类似乎与JSON 匹配。
    2. 我使用具有自定义日期格式的 IsoDateTimeConverter 来处理 TickTime,因为 JSON 中的日期不符合 Json.Net 期望的标准 ISO 8601 日期时间格式。

    这里是完整的代码:

    class Program
    {
        static void Main(string[] args)
        {
            string json = @"{""d"": ""{\""TickTime\"":\""29/04/2014 19:13:41\"",\""Symbols\"":[{\""I\"":61,\""H\"":0.8551,\""L\"":0.8516,\""A\"":0.855,\""B\"":0.8545},{\""I\"":62,\""H\"":1301.4,\""L\"":1286.3,\""A\"":1296.6,\""B\"":1296.4}]}""}";
    
            IsoDateTimeConverter dateConverter = new IsoDateTimeConverter
            {
                DateTimeFormat = "dd/MM/yyyy HH:mm:ss"
            };
    
            var outerRoot = JsonConvert.DeserializeObject<OuterRootObject>(json);
            var root = JsonConvert.DeserializeObject<RootObject>(outerRoot.d, dateConverter);
    
            Console.WriteLine("TickTime: " + root.TickTime.ToString("dd-MMM-yyyy hh:mm:ss tt"));
            foreach (Result r in root.Symbols)
            {
                Console.WriteLine("I: " + r.I);
                Console.WriteLine("A: " + r.A);
                Console.WriteLine("B: " + r.B);
                Console.WriteLine("H: " + r.H);
                Console.WriteLine("L: " + r.L);
                Console.WriteLine();
            }
        }
    }
    
    public class OuterRootObject
    {
        public string d { get; set; }
    }
    
    public class RootObject
    {
        public DateTime TickTime { get; set; }
        public List<Result> Symbols { get; set; }
    }
    
    public class Result
    {
        public int I { get; set; }
        public double A { get; set; }
        public double B { get; set; }
        public double H { get; set; }
        public double L { get; set; }
    }
    

    输出:

    TickTime: 29-Apr-2014 07:13:41 PM
    I: 61
    A: 0.855
    B: 0.8545
    H: 0.8551
    L: 0.8516
    
    I: 62
    A: 1296.6
    B: 1296.4
    H: 1301.4
    L: 1286.3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      相关资源
      最近更新 更多