Назначить Json строке без сериализации в С#

У меня есть строка JSON

{
  "F1":
  { 
    "BF1":"BV1",
    "BF2":"BV2"
  },
  "F2":"BF1"
}

и я хочу присвоить его объекту этого типа

public class MyType
{
   public string F1 {get;set;} 
   public string F2 {get;set;}
}

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

Что вы пробовали, что не получилось?

Fildor 13.04.2023 13:00

Похоже, вам, вероятно, понадобится специальный конвертер. Мы не можем легко предоставить полезный пример этого, не зная, по крайней мере, какую среду JSON вы используете, например. Newtonsoft.Json или System.Text.Json.

Jon Skeet 13.04.2023 13:01

Самый простой способ — десериализовать все это и повторно сериализовать ту часть, которую вы хотите оставить в формате JSON.

Robert Harvey 13.04.2023 13:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

самый простой способ

    var jObj = JObject.Parse(json);

    MyType myType = new MyType
    {
        F1 = jObj["F1"].ToString(),
        F2 = jObj["F2"].ToString()
    };

или если вы не хотите форматирования отступа

MyType myType = new MyType
    {
        F1 = JsonConvert.SerializeObject(jObj["F1"]),
        F2 = (string) jObj["F2"];
    };

Если вам нравится трудный путь

MyType myType = JsonConvert.DeserializeObject<MyType>(json,new MyTypeJsonConverter());

public class MyTypeJsonConverter : JsonConverter<MyType>
{
    public override MyType ReadJson(JsonReader reader, Type objectType, MyType existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jObj = JObject.Load(reader);

        return new MyType
        {
            F1 = JsonConvert.SerializeObject(jObj["F1"]),
            F2 = (string)jObj["F2"]
        };
    }

    // or maybe this 
    // public override bool CanWrite => false;

    public override void WriteJson(JsonWriter writer, MyType value, JsonSerializer serializer)
    {
        var val = new
        {
            F1 = JObject.Parse(value.F1),
            F2 = value.F2
        };
        
        writer.WriteRaw(JsonConvert.SerializeObject(val, Newtonsoft.Json.Formatting.Indented));
    }
    
}

или если у вас есть много свойств, которые должны десериализоваться обычным способом

MyType myType = JsonConvert.DeserializeObject<MyType>(json);

public class MyType
{ 
   [JsonConverter(typeof(MyTypePropertyJsonConverter))]
    public string F1 { get; set; }
    
    public string F2 { get; set; }
}

public class MyTypePropertyJsonConverter : JsonConverter<string>
{
    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        return JsonConvert.SerializeObject(JToken.Load(reader));
    }

    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
    {
        writer.WriteRawValue(value);
    }
}

Спасибо за ваши усилия, но в классе MyTypePropertyJsonConverter как закодировать метод WriteJson??

Taha Babi 14.04.2023 04:48

@TahaBabi Какой код вы используете?

Serge 14.04.2023 05:17

я использую четвертый

Taha Babi 14.04.2023 05:29

@TahaBabi Я исправил это, попробуй сейчас

Serge 14.04.2023 05:34

Хотя ответ, опубликованный @serge, мне кажется лучше всего. Но я потратил некоторое время, чтобы решить вашу проблему, и в итоге получил следующий код:

dynamic jsonElement = JsonSerializer.Deserialize<dynamic>(json);
MyType myType = new MyType();
myType.F1 = jsonElement.GetProperty("F1").ToString();
myType.F2 = jsonElement.GetProperty("F2").ToString();       
Console.WriteLine(myType.F1 + ", " + myType.F2);

Я надеюсь, что это может помочь вам каким-то образом.

Другие вопросы по теме