在C#中解析复杂的json字符串

时间:2017-12-16 14:35:35

标签: c#

{
  "irCurves": {
    "EUR": {
      "FCC-IRCUBE": [
        {
          "curveDefinitionId": "FCC",
          "curveFamilyId": "EUR/EURCURVE",
          "curveName": "EURCURVE",
          "marketDataSet": "FCC-IRCUBE",
          "referenced": false
        }
      ]
    },
    "GBP": {
      "FCC-IRCUBE": [
        {
          "curveDefinitionId": "FCC",
          "curveFamilyId": "value",
          "curveName": "value",
          "marketDataSet": "value",
          "referenced": false
        }
      ]
    },
    "USD": {
      "FCC-IRCUBE": [
        {
          "curveDefinitionId": "FCC",
          "curveFamilyId": "value",
          "curveName": "value",
          "marketDataSet": "value",
          "referenced": false
        },
        {
          "curveDefinitionId": "FCC",
          "curveFamilyId": "value",
          "curveName": "value",
          "marketDataSet": "value",
          "referenced": false
        }
      ]
    }
  }
}

从上面的json我需要选择“USD”,“EUR”,“GBP”。 我如何解析这个json以获得C#中的上述值。 此上面的json响应总是不一样。它是一个动态响应,我们无法跟踪键。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Cinchoo ETL - 一个用于解析和创建JSON文件的开源库。

下面的示例显示了如何使用JSONPath获取USD,EUR,GBP节点

    public class IRCUBE
    {
        public string CurveDefinitionId { get; set; }
        public string CurveFamilyId { get; set; }
        public string CurveName { get; set; }
        public string MarketDataSet { get; set; }
        public string Referenced { get; set; }

        public override string ToString()
        {
            StringBuilder msg = new StringBuilder();

            msg.AppendLine("CurveDefinitionId: " + CurveDefinitionId);
            msg.AppendLine("CurveFamilyId: " + CurveFamilyId);
            msg.AppendLine("CurveName: " + CurveName);
            msg.AppendLine("MarketDataSet: " + MarketDataSet);
            msg.AppendLine("Referenced: " + Referenced);

            return msg.ToString();
        }
    }

    using (var p = new ChoJSONReader("sample14.json")
        .WithField("USD", jsonPath: "$..USD.FCC-IRCUBE", fieldType: typeof(IRCUBE[]))
        .WithField("EUR", jsonPath: "$..EUR.FCC-IRCUBE", fieldType: typeof(IRCUBE[]))
        .WithField("GBP", jsonPath: "$..GBP.FCC-IRCUBE", fieldType: typeof(IRCUBE[]))
    )
    {
        foreach (dynamic rec in p)
        {
            Console.WriteLine("USD:");
            Console.WriteLine();
            foreach (var curr in rec.USD)
            {
                Console.WriteLine(curr.ToString());
            }
            Console.WriteLine();
        }
    }

希望这有帮助。

免责声明:我是图书馆的作者。

答案 1 :(得分:-1)

使用您的JSON文件的所有数据创建class,然后使用StreamReader读取您的JSON文件。

string sJSONfile = StreamReader_Temp.ReadToEnd();

JavaScriptSerializer JavaScriptSerializer_Temp = new JavaScriptSerializer();
YourClass dict = JavaScriptSerializer_Temp.Deserialize<YourClass>(sJSONfile);

提示:该课程应如下所示 我使用https://jsonutils.com/将JSON转换为C#

public class FCCIRCUBE
{
    public string curveDefinitionId { get; set; }
    public string curveFamilyId { get; set; }
    public string curveName { get; set; }
    public string marketDataSet { get; set; }
    public bool referenced { get; set; }
}

public class EUR
{
    public IList<FCCIRCUBE> FCC-IRCUBE { get; set; }
}

public class FCCIRCUBE
{
    public string curveDefinitionId { get; set; }
    public string curveFamilyId { get; set; }
    public string curveName { get; set; }
    public string marketDataSet { get; set; }
    public bool referenced { get; set; }
}

public class GBP
{
    public IList<FCCIRCUBE> FCC-IRCUBE { get; set; }
}

public class FCCIRCUBE
{
    public string curveDefinitionId { get; set; }
    public string curveFamilyId { get; set; }
    public string curveName { get; set; }
    public string marketDataSet { get; set; }
    public bool referenced { get; set; }
}

public class USD
{
    public IList<FCCIRCUBE> FCC-IRCUBE { get; set; }
}

public class IrCurves
{
    public EUR EUR { get; set; }
    public GBP GBP { get; set; }
    public USD USD { get; set; }
}

public class Example
{
    public IrCurves irCurves { get; set; }
}