2

我在外部文件中有以下 JSON:

{
    "Name": "Service Provider",
    "Categories": [
        {
            "Name": "Identity",
            "Mandatory": false
        },
        {
            "Name": "Contat Information",
            "Mandatory": false
        },
        {
            "Name": "Service Fields",
            "Mandatory": false
        },
        {
            "Name": "Addresses",
            "Mandatory": false
        },
        {
            "Name": "Bank Accounts",
            "Mandatory": false
        }
    ]
}

例如,如果我想替换“身份”类别,使其在内存中看起来像这样:

{
    "Name": "Identity",
    "Mandatory": true,
    ...
}

我可以写这样的东西:

JObject jObject = return JsonConvert.DeserializeObject<JObject>(File.ReadAllText(path));

// "GetNewIdentity()" gets a JObject representing the new "Identity" JSON shown above
jObject["Categories"][0] = GetNewIdentity();

问题是我需要知道在编写代码时要更改什么类别。如果我只在运行时知道要更改哪个类别怎么办?

这就是为什么我想使用它的Name属性在数组中找到要替换的类别。我尝试了以下代码:

// "name" comes from a different place.
result["Categories"].Single(c => c["Name"].Equals(name)) = GetNewIdentity();

但是因为我试图将值分配给返回值而不是变量,所以我收到以下错误:

赋值的左侧必须是变量、属性或索引器

我还希望在替换后保留类别的顺序。我怎样才能做到这一点?


笔记:

我没有或可以有代表 JSON 的 POCO 类。

4

2 回答 2

1

这是一个示例,您可以如何做到这一点。您需要的是访问您想要的属性并替换它的值。

void Main()
{
    JObject jObject = JsonConvert.DeserializeObject<JObject>(File.ReadAllText(path));
    JObject newCategory = new JObject();
    newCategory.Add("Name", "Identity");
    newCategory.Add("Mandatory", "false");
    newCategory.Add("NewProp", "Yes");
    ReplaceCategoryValue(jObject, "Identity", newCategory);

    Console.WriteLine(jObject.ToString());
}

void ReplaceCategoryValue(JObject jObject, string categoryName, JObject newCategory)
{
    JToken categories = jObject["Categories"];
    JObject targetCategory = categories.Children<JObject>().FirstOrDefault(x => x.Property("Name").Value.ToString() == categoryName);
    targetCategory.Replace(newCategory);
}
于 2018-10-23T13:19:25.900 回答
1

我仍然不明白您为什么不定义 POCO。这里看看这个。这是你的 POCOS

public class MyRootObject
{
    public string Name { get; set; }
    public List<Category> Categories { get; set; }
}

public class Category
{
    public string Name { get; set; }
    public bool Mandatory { get; set; }
}

这就是你使用它的方式

var rootObject = JsonConvert.DeserializeObject<MyRootObject>(Resource.Json);
//name comes from somewhere else like in the question
var identity = rootObject.Categories.Single(c => c.Name == name);
identity.Mandatory = GetNewIdentity();
于 2018-10-23T10:55:12.253 回答