【问题标题】:Easily working on a json object轻松处理 json 对象
【发布时间】:2016-04-18 17:50:07
【问题描述】:

我正在将 json 字符串反序列化(或解析)为 c# 对象(使用 Json.NET)并获取 JObject。我想用键“bla”迭代所有属性,就像用 XElement.Elements("bla") 迭代所有名为“bla”的 xml 元素一样。

如果不可能,我想将我的 json 字符串反序列化为一个 c# 对象,并在我的反序列化 json 对象上动态和递归地工作(我的 json 字符串可以包含可以包含 2 种类型对象的列表/数组。 最后在编辑我的对象(更改值并删除或添加属性)之后,我需要将我的对象序列化回 json 字符串。 使用 json 序列化和反序列化的最佳和最简单的方法是什么?

我的 Json 看起来像这样:

{"Families":{"Family":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}, {"propA":"dhsj", "propB":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}, {"propA":"dhsj", "propB":"fghfgh"}]}]}

总之,json值是一个json对象,它的值是一个列表/数组,列表/数组可以包含2种“类型”的对象,其中一种类型也有一个属性,它的值是一个json它的值是一个列表/数组的对象,它递归地像这样。有时,没有属性的类型的道具之一的值是一个json对象,它的值是一个列表/数组,可以是一个列表/数组本身,它只能包含一种类型提到了两个。

【问题讨论】:

  • 你看JObject中的方法了吗?他们正是这样做的。
  • 我没有找到类似于迭代 XElement.Elements("bla") 的 JObject 方法,它给了我每个名为 bla 的元素。
  • 我调整了答案以适合您的 JSON,递归迭代到 N 级并动态添加属性。

标签: c# json xml object serialization


【解决方案1】:

如果不需要强类型对象,可以反序列化为字典:

Dictionary<string, object> myObject = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);

然后把它当作字典使用:

myObject["Property"] = value;

或者

foreach(var propertyKey in myObject.Keys)
{
  // do something with each property
  Console.WriteLine($"{propertyKey} = {myObject[propertyKey]}");
}

Here's a fiddle

完成后可以序列化回来

【讨论】:

  • 一个 JObject 是一个字典,所以你甚至需要改变那部分。
  • @JonathanAllen 我不知道,但有道理
【解决方案2】:

我的 json 看起来更像这样:

{"Familys":{"Family":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}]} 

【讨论】:

    【解决方案3】:

    对于这样的 JSON:

    var json = @"{
        ""Families"":{
            ""Family"":[
                {
                ""propA"":""Top""
                },
                {
                ""propA"":""Top.Lower"",
                ""Families"":{
                    ""Family"":[
                        {
                            ""propB"":""propB value""
                        },
                        {
                            ""propA"":""Top.Lower.EvenLower"",
                            ""Families"":{
                            ""Family"":[
                                {
                                    ""propA"":""Top.Lower.EvenLower.EvenLower""
                                }
                            ]
                            }
                        }
                    ]
                }
                }
            ]
        }
    }";
    

    做这样的事情:

    //calling code makes use of "dynamic" to make things clean and readable.
    dynamic parsedJson = JsonConvert.DeserializeObject(json);
    var allPropAValues = GetPropAValues(parsedJson);
    //**** NOTE: this has our extra property ****
    var jsonWithExtraStuffProperty = JsonConvert.SerializeObject(parsedJson);
    
    //recursive function that reads AND writes properties
    public static List<string> GetPropAValues(dynamic obj)
    {
        var propAValues = new List<string>();
    
        //**** NOTE: the use of an added property ****
        obj.ExtraStuff = new Random().Next();
    
        //if we have a propA value, get it.
        if (obj.propA != null)
            propAValues.Add(obj.propA.Value);
    
        //iterate through families if there are any. your JSON had Families.Family.
        if (obj.Families != null)
            foreach (dynamic family in obj.Families.Family)
                propAValues.AddRange(GetPropAValues(family));
    
        return propAValues;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多