【问题标题】:C# Parsing JSON array of objectsC#解析JSON对象数组
【发布时间】:2013-11-11 15:52:13
【问题描述】:

我有一个类似json 格式的对象数组:

{"results":[{"SwiftCode":"","City":"","BankName":"Deutsche Bank","Bankkey":"10020030","Bankcountry":"DE"},{"SwiftCode":"","City":"10891 Berlin","BankName":"Commerzbank Berlin (West)","Bankkey":"10040000","Bankcountry":"DE"}]}

我想要的是 C# 中的object[],其中一个对象包含一个 json 对象中的所有数据。问题是,我可以使用此对象的属性创建一个类,如下所示:

public class Result
{
    public int SwiftCode { get; set; }
    public string City { get; set; }
    //      .
    //      .
    public string Bankcountry { get; set; }
}

因为我每次都得到不同的结果,但我知道它总是一个对象数组。有人知道我如何设法找回一组对象吗?

编辑

我必须通过 WriteObject(results) 将此对象传递给 powershell。所以输出应该只是array中的对象。

【问题讨论】:

  • 更好的问题是,如果您甚至不知道对象会是什么样子,为什么还需要它成为 c# 中的 object[]?听起来您应该改用字典之类的东西。
  • 我不必知道它是什么类型的对象,我在 powershell 中将它交给最终用户。

标签: c# arrays json parsing


【解决方案1】:

虽然这是一个老问题,但我想我还是会发布我的答案,如果这对未来的人有帮助的话

 JArray array = JArray.Parse(jsonString);
 foreach (JObject obj in array.Children<JObject>())
 {
     foreach (JProperty singleProp in obj.Properties())
     {
         string name = singleProp.Name;
         string value = singleProp.Value.ToString();
         //Do something with name and value
         //System.Windows.MessageBox.Show("name is "+name+" and value is "+value);
      }
 }

此解决方案使用 Newtonsoft 库,不要忘记包含 using Newtonsoft.Json.Linq;

【讨论】:

    【解决方案2】:

    像这样使用newtonsoft

    using System.Collections.Generic;
    using System.Linq;
    using Newtonsoft.Json.Linq;
    
    class Program
    {
        static void Main()
        {
            string json = "{'results':[{'SwiftCode':'','City':'','BankName':'Deutsche    Bank','Bankkey':'10020030','Bankcountry':'DE'},{'SwiftCode':'','City':'10891    Berlin','BankName':'Commerzbank Berlin (West)','Bankkey':'10040000','Bankcountry':'DE'}]}";
    
            var resultObjects = AllChildren(JObject.Parse(json))
                .First(c => c.Type == JTokenType.Array && c.Path.Contains("results"))
                .Children<JObject>();
    
            foreach (JObject result in resultObjects) {
                foreach (JProperty property in result.Properties()) {
                    // do something with the property belonging to result
                }
            }
        }
    
        // recursively yield all children of json
        private static IEnumerable<JToken> AllChildren(JToken json)
        {
            foreach (var c in json.Children()) {
                yield return c;
                foreach (var cc in AllChildren(c)) {
                    yield return cc;
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答,它也很有帮助。但是如果我的字符串看起来像 tring json = "{'test':{'results':[{'SwiftCode':'','City':'','BankName':'Deutsche Bank','Bankkey':'10020030','Bankcountry':'DE'},{'SwiftCode':'','City':'10891 Berlin','BankName':'Commerzbank Berlin (West)','Bankkey':'10040000','Bankcountry':'DE'}]}}";
    • results 数组是否在任何级别嵌套信号以吐出封闭的对象?
    • 是的 results 它始终是我需要的 object[] 的名称。用下面的代码解决了:dynamic obj = JsonConvert.DeserializeObject(json); var convert = obj.d.results.ToString(); ErrorRecord errorRecord; var result = JsonObject.ConvertFromJson(convert, out errorRecord);你有更流畅的解决方案吗?
    • 现在又出现了一个问题。在我的 rawjson 的某个地方,我在 unixtimestamp 中有这样的日期:Date: "/Date(1382400000)/"。但是如果以这种方式解析 json,它会自动尝试转换为 DateTime 类型,但日期错误。那么我可以只覆盖解析日期的部分吗?这对我有很大帮助。
    • @AstralisSomnium 这可能会引导您朝着正确的方向前进:stackoverflow.com/questions/18088406/…
    【解决方案3】:

    使用NewtonSoft JSON.Net 库。

    dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的快速答复。我已经尝试过dynamic,但它甚至存储了有关数组本身的信息(如类型、有值、第一、最后、父...),但我不需要这些。我只需要objects
    • 那么,忽略你不感兴趣的数据并从 obj.results[x] 中获取?
    • 圣土豆,太棒了!不知道我可以在 dynamic 类中使用 .whateverIwantHere。谢谢马文!
    【解决方案4】:

    我刚刚得到了一个更简单的解决方案,即从 JSON 对象中获取列表。希望这能有所帮助。

    我得到了这样的 JSON:

    {"Accounts":"[{\"bank\":\"Itau\",\"account\":\"456\",\"agency\":\"0444\",\"digit\":\"5\"}]"}
    

    并制作了一些这样的类型

        public class FinancialData
    {
        public string Accounts { get; set; } // this will store the JSON string
        public List<Accounts> AccountsList { get; set; } // this will be the actually list. 
    }
    
        public class Accounts
    {
        public string bank { get; set; }
        public string account { get; set; }
        public string agency { get; set; }
        public string digit { get; set; }
    
    }
    

    还有“魔法”部分

     Models.FinancialData financialData = (Models.FinancialData)JsonConvert.DeserializeObject(myJSON,typeof(Models.FinancialData));
            var accounts = JsonConvert.DeserializeObject(financialData.Accounts) as JArray;
    
            foreach (var account in  accounts)
            {
                if (financialData.AccountsList == null)
                {
                    financialData.AccountsList = new List<Models.Accounts>();
                }
    
                financialData.AccountsList.Add(JsonConvert.DeserializeObject<Models.Accounts>(account.ToString()));
            }
    

    【讨论】:

    • 这其实是在父json对象里面解析一个json集合的正确方式。
    • 我正在创建各种不起作用的笨拙解决方案。我知道会有一个简单、优雅的解决方案来获取单个 JSON 字段中的记录。谢谢!
    【解决方案5】:

    我相信这要简单得多;

    dynamic obj = JObject.Parse(jsonString);
    string results  = obj.results;
    foreach(string result in result.Split('))
    {
    //Todo
    }
    

    【讨论】:

      【解决方案6】:

      使用.NET 6,您可以使用内置的System.Text.Json.Nodes

      例子:

      string json = @"{""results"":[{""SwiftCode"":"""",""City"":"""",""BankName"":""Deutsche Bank"",""Bankkey"":""10020030"",""Bankcountry"":""DE""},{""SwiftCode"":"""",""City"":""10891 Berlin"",""BankName"":""Commerzbank Berlin (West)"",""Bankkey"":""10040000"",""Bankcountry"":""DE""}]}";
      
      JsonObject obj = JsonNode.Parse(json).AsObject();
      JsonArray jsonArray = (JsonArray)obj["results"];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多