C# 轻松处理json对象

C# 轻松处理json对象,c#,json,xml,object,serialization,C#,Json,Xml,Object,Serialization,我正在将json字符串反序列化(或解析)为c#对象(使用json.NET)并获得一个JObject。我想用键“bla”迭代所有属性,就像用XElement.elements(“bla”)迭代所有名为“bla”的xml元素一样 如果不可能,我希望将我的json字符串反序列化为一个c#对象,并在反序列化的json对象上动态递归地工作(我的json字符串可以有两种类型的对象的列表/数组)。 最后,在编辑对象(更改值、删除或添加属性)后,我需要将对象序列化回json字符串。 使用json序列化和反序列化

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

如果不可能,我希望将我的json字符串反序列化为一个c#对象,并在反序列化的json对象上动态递归地工作(我的json字符串可以有两种类型的对象的列表/数组)。 最后,在编辑对象(更改值、删除或添加属性)后,我需要将对象序列化回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"}]}]}
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;
}
{"Familys":{"Family":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}]} 

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

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

Dictionary<string, object> myObject = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
myObject["Property"] = value;

您可以在完成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"}]}]}
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;
}
{"Familys":{"Family":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}]} 
这样做:

{"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"}]}]}
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;
}
{"Familys":{"Family":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}]} 
//调用代码利用“动态”使事情变得清晰易读。
动态parsedJson=JsonConvert.DeserializeObject(json);
var allPropAValues=GetPropAValues(parsedJson);
//****注意:这是我们的额外财产****
var jsonWithExtraStuffProperty=JsonConvert.SerializeObject(parsedJson);
//读取和写入属性的递归函数
公共静态列表值(动态obj)
{
var propAValues=新列表();
//****注意:添加属性的使用****
obj.ExtraStuff=newrandom().Next();
//如果我们有一个propA值,就得到它。
if(obj.propA!=null)
添加(对象过程值);
//如果有族,则遍历族。您的JSON有families.Family。
if(obj.Families!=null)
foreach(对象族中的动态族)
AddRange(GetPropAValues(family));
返回值;
}

我的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"}]}]}
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;
}
{"Familys":{"Family":[{"propA":"dhsj", "propB":"dhdisb"}, {"propA":"krbsbs", "propC":"ksndbd", "propD":"odndns", "Families":{"Family":[....]}}]} 

你看过
JObject
中的方法了吗?它们就是这样做的。我没有找到一种类似于迭代XElement.Elements(“bla”)的JObject方法这给了我每个名为bla的元素。我调整了我的答案以适合您的JSON,递归地迭代到N级并动态添加属性。JObject是一个字典,所以您甚至需要更改该部分。@Jonathanalen我不知道,但有意义