C # Чтение json и редактирование

#c# #json

#c# #json

Вопрос:

РЕШЕНИЕ

         Profile newProfileList = new Profile();
        newProfileList = myDeserializedClass.profiles[0]; // New profile list is null so i've casted some values from old ones.
        myDeserializedClass.profiles.Add(newProfileList);
        richTextBox1.Text = JsonConvert.SerializeObject(myDeserializedClass); 
  

Затем я могу снова сохранить его как файл json. Спасибо @Donut

У меня есть следующий код:

 OpenFileDialog ofd = new OpenFileDialog();
string txtProfile;
if (ofd.ShowDialog() == DialogResult.OK)
{
    txtProfile = File.ReadAllText(ofd.FileName);
    richTextBox1.Text = txtProfile;
}
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(richTextBox1.Text);
  

Используя этот код, я могу прочитать файл JSON и успешно десериализовать его в экземпляр Root класса. Однако, когда я пытаюсь создать новые профили в этом объекте, я получаю некоторую ошибку о «значениях только для чтения»:

Form1.cs(124,13,124,47): ошибка CS0200: список свойств или индексаторов <Form1.Profile>.Count’ не может быть назначен — он доступен только для чтения

Как я могу правильно отредактировать десериализованные данные (например, добавить новые экземпляры Profile класса) и сохранить их обратно в файл JSON?

Для справки, вот классы, которые я использую для десериализации.

 public class Metadata
{
    public string app_flavor { get; set; }
    public int app_version { get; set; }
}

public class Profile
{
    public int ajax_connections_limit { get; set; }
    public bool allow_emulator_ua_detection { get; set; }
    public string apply_css_patches { get; set; }
    public bool created_by_user { get; set; }
    public string custom_user_agent { get; set; }
    public bool device_custom_dev_id2 { get; set; }
    public string device_id { get; set; }
    public string device_id2 { get; set; }
    public string device_id_seed { get; set; }
    public string device_signature { get; set; }
    public string display_resolution { get; set; }
    public bool enable_ministra_compatibility { get; set; }
    public bool external_player_send_back_key_event { get; set; }
    public bool external_player_send_exit_key_event { get; set; }
    public bool external_player_send_key_event { get; set; }
    public bool external_player_send_ok_key_event { get; set; }
    public string firmware { get; set; }
    public string firmware_js_api_ver { get; set; }
    public string firmware_player_engine_ver { get; set; }
    public string firmware_stb_api_ver { get; set; }
    public bool fix_ajax { get; set; }
    public bool fix_background_color { get; set; }
    public bool fix_local_file_scheme { get; set; }
    public bool front_panel { get; set; }
    public int generic_connections_limit { get; set; }
    public string hardware_vendor { get; set; }
    public string hardware_version { get; set; }
    public string image_date { get; set; }
    public string image_description { get; set; }
    public string image_version { get; set; }
    public string internal_portal_url { get; set; }
    public bool is_internal_portal { get; set; }
    public int lang_audiotracks { get; set; }
    public int lang_subtitles { get; set; }
    public string language { get; set; }
    public bool limit_max_connections { get; set; }
    public string mac_address { get; set; }
    public string mac_seed_net_interface { get; set; }
    public string media_player { get; set; }
    public bool media_player_per_channel { get; set; }
    public string name { get; set; }
    public string ntp_server { get; set; }
    public string overwrite_stream_protocol { get; set; }
    public string playlist_charset { get; set; }
    public string portal_url { get; set; }
    public string proxy_host { get; set; }
    public int proxy_port { get; set; }
    public bool send_device_id { get; set; }
    public string serial_number { get; set; }
    public bool show_player_name { get; set; }
    public string stb_internal_config { get; set; }
    public string stb_model { get; set; }
    public bool subtitles_on { get; set; }
    public string tasks_data { get; set; }
    public bool timeshift_enabled { get; set; }
    public string timeshift_path { get; set; }
    public string timezone { get; set; }
    public bool udpxy_enabled { get; set; }
    public string udpxy_url { get; set; }
    public bool use_alt_stalker_auth_dialog { get; set; }
    public bool use_alternative_web_view_scale_method { get; set; }
    public bool use_browser_redirection { get; set; }
    public bool use_custom_user_agent { get; set; }
    public bool use_extended_mag_api { get; set; }
    public bool use_http_proxy { get; set; }
    public bool use_mac_based_device_id { get; set; }
    public string user_agent { get; set; }
    public string uuid { get; set; }
    public string video_resolution { get; set; }
    public int video_resume_time { get; set; }
    public string weather_place { get; set; }
    public bool web_proxy_enabled { get; set; }
}

public class Root
{
    public Metadata metadata { get; set; }
    public List<Profile> profiles { get; set; }
}
  

Комментарии:

1. Единственным свойством, доступным только для чтения, является Count свойство profiles , потому что это a List<Profile> . Чтобы изменить Count , вам нужно добавить или удалить элементы из списка.

2. @HereticMonkey как я могу это сделать? Можете ли вы дать мне конкретный пример или ключевые слова для того, как я собираюсь создать новый список <Профиль> ?

3. Вы можете просто позвонить profiles.Add(new Profile() ...) . Добавление или удаление элементов из списка автоматически обновит Count свойство… но, исходя из того, что, похоже, вы пытаетесь сделать, Count свойство на самом деле не требуется для сериализации объекта обратно в JSON.

4. myDeserializedClass.profiles. Добавить (новый профиль () …)

5. О, спасибо всем, особенно Donut! Теперь я могу создать новое количество в разделе профиля json, используя myDeserializedClass.profiles. Добавить (новый профиль ()); и я могу снова сериализовать его. Спасибо всем