Обновить объект JSON - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь прочитать и обновить массив JSON из файла. Но я получаю эту ошибку при попытке обновить значение свойства. - Свойству или индексатору нельзя присвоить «-», он доступен только для чтения

Вот мой код -

var referenceFile = @"TestData\report.json";
var json1 = File.ReadAllText(referenceFile);

JArray jsonArray = JArray.Parse(json1);
JObject array = JObject.Parse(jsonArray[0].ToString());

foreach (var item in array)
{
    var x = item.Value;
    item.Value = "test"; // Error
}

Мой вопрос в том, как я могу обновить JSON. это файл json, который мне нужно обновить.

[
  {
    "description": "",
    "elements": [
      {
         "description": ""
            ],
    "id": "",
    "keyword": "Feature",
    "line": 1,
    "name": "Validate data via DB Connection",
    "uri": "dbtest/DB_Query.feature"
  }
]

Ответы [ 4 ]

2 голосов
/ 09 июля 2020

С фиксированным json вы можете использовать Replace, например, чтобы изменить все значения на "test":

var json = @"[
  {
    ""description"": """",
    ""elements"": [
      {
         ""description"": """"
       }],
    ""id"": """",
    ""keyword"": ""Feature"",
    ""line"": 1,
    ""name"": ""Validate data via DB Connection"",
    ""uri"": ""dbtest/DB_Query.feature""
  }
]";

var jarr = JArray.Parse(json);
foreach(var jVal in jarr.Descendants().OfType<JValue>())
{
    jVal.Replace(new JValue("test"));
}

Вы получите следующий json для jarr:

[
  {
    "description": "test",
    "elements": [
      {
        "description": "test"
      }
    ],
    "id": "test",
    "keyword": "test",
    "line": "test",
    "name": "test",
    "uri": "test"
  }
]

Если вы хотите изменить конкретное свойство, вы можете просто использовать индексаторы:

jarr[0]["description"] = "test1"; // sets root "description" of first element to "test1"
0 голосов
/ 09 июля 2020

Ответ, предоставленный Гуру Строном выше, должен помочь! Если вы используете Visual Studio IDE, с вашим кодом -

foreach (var item in array)
        {
            var x = item.Value;
            item.Value = "test"; // Error
        }

происходит сбой сборки с четким объяснением: «Свойство или индексатор» KeyValuePair .Value 'не может быть присвоено - он доступен только для чтения.

Короче говоря, с помощью вашего кода вы пытаетесь изменить что-то, что доступно только для чтения.

0 голосов
/ 09 июля 2020

Вы повторяете JObject - который вы назвали array, поэтому тип итератора будет KeyValuePair<string, JToken>. Свойство KeyValuePair.Value имеет только геттер

Я ожидаю, что вы намеревались сделать l oop над свойствами объекта, так что тип итератора JProperty. Они выставляются через JObject.Properties().

0 голосов
/ 09 июля 2020

Не следует ли вам создать класс, представляющий JSON?

В этом случае вы можете десериализовать JSON в объект, обновить его и снова сериализовать?

var myObject JsonConvert.DeserializeObject<MyClass>(json1);
myObject.First().Description = "Hello" // Obviously you modify the field/value you want
var json2 JsonConvert.SerializeObject(myObject);

Это значительно улучшит читаемость вместо использования JArray / JObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...