Десериализация JSON в класс, содержащий динамическое свойство c с System.Text. Json - PullRequest
1 голос
/ 28 января 2020

Цель состоит в десериализации ответа JSON на класс ответа оболочки, содержащий динамическую часть c, с использованием новой библиотеки System.Text. Json из NET Core 3 .

То есть

{
    "fixedProperty": "Hello",
    "dynamicProperty": { 
        "attributeOne": "One",
        "attributeTwo": "Two",
    }
}

до

public class MyResponseClass
{
    public string FixedProperty { get; set; }
    public dynamic DynamicProperty { get; set; }  
}

// Where the dynamic property is one of the classes.
// (MyDataClassOne in the particular JSON example above)
public class MyDataClassOne
{
    public string AttributeOne { get; set; }
    public string AttributeTwo { get; set; }  
}

public class MyDataClassTwo
{
    public string AttributeThree { get; set; }
    public string AttributeFour { get; set; }  
}

...

Тип свойства Dynami c в ответе всегда известен заранее (зависит от запроса), и является одним из, скажем, трех разных классов.

Не могу найти чистый способ сделать это, за исключением того, что нет одного класса-оболочки со свойством динамического c, но несколько различных классов ответов для каждого из случаев (что, очевидно, работает нормально, но не является желаемым решением).

РЕДАКТИРОВАТЬ: Решением было использование обобщенного c.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Поскольку тип свойства Dynami c в ответе всегда известен заранее (зависит от запроса) , вы можете использовать generi c root object:

public class MyResponseClass<T> 
{ 
    public string FixedProperty { get; set; } 
    public T DynamicProperty { get; set; } 
}

А затем объявите T как необходимый конкретный класс, например,

var root = JsonSerializer.Deserialize<MyResponseClass<MyDataClassOne>>(responseString);
var fixedProperty = root.fixedProperty;
var attributeOne = root.DynamicProperty?.AttributeOne;
0 голосов
/ 28 января 2020

Как насчет этого?

var myResponseClass = new MyResponseClass();

dynamic myClass = JsonSerializer.Deserialize<ExpandoObject>("{\"fixedProperty\":\"Hello\",\"dynamicProperty\": {\"attributeOne\":\"One\",\"attributeTwo\":\"Two\"}}");
dynamic myProperty = JsonSerializer.Deserialize<ExpandoObject>(myClass.dynamicProperty.ToString());

myResponseClass.FixedProperty = myClass.fixedProperty.ToString();
myResponseClass.DynamicProperty = myProperty;
...