JsonSerializer.反序列化始终返回Null

nx7onnlm  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(378)

正在尝试反序列化以下JSON字符串:

string json = "{\"d\":{\"__metadata\":{\"id\":\"http://my.dev.int:8000/sap/opu/odata/sap/ZFIORI_SERIAL_NUMBERS_SRV/MATERIALSet('250')\",\"uri\":\"http://my.dev.int:8000/sap/opu/odata/sap/ZFIORI_SERIAL_NUMBERS_SRV/MATERIALSet('250')\",\"type\":\"ZFIORI_SERIAL_NUMBERS_SRV.MATERIAL\"},\"MATNR\":\"250\",\"MAKTX\":\"X:K10/MF250\"}}";

转换为类对象

namespace Scanner.Model
{
    public class Material
    {
        public string MATNR { get; set; }
        public string MAKTX { get; set; }
    }
}

我尝试过很多方法,包括:

Material material = JsonSerializer.Deserialize<Material>(json, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true,
    IgnoreNullValues = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
});

Console.WriteLine(material.MATNR); //expected output: 250
Console.WriteLine(material.MAKTX); //expected  output: X:K10/MF250

但是material.MATNR和material.MAKTX始终为空。

46scxncf

46scxncf1#

我认为您需要更熟悉Json结构,Material不是您的Json字符串中返回的对象类型,它是主对象的嵌套类,我已经组装了一个点网小提琴并测试了这将为您工作,如您所见,主对象是我称之为MyJson的对象,它拥有类类型为MetaData的一个属性和属性名称d,该类包含3个属性:类型MetaBase,包含3个string类型的属性和2个其他string属性,然后将json字符串反序列化为MyJson的主对象类型,然后将嵌套属性MATNR写入控制台窗口,这将打印250,我还使用JsonPropertyNameAttribute将某些类属性设置为json字符串中的匹配值,你可以在这里读到更多信息:system.text.json.serialization.jsonpropertynameattribute在这里拨弄dotnet-fiddle

using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class Program
{
    public static void Main()
    {
        string json = "{\"d\":{\"__metadata\":{\"id\":\"http://my.dev.int:8000/sap/opu/odata/sap/ZFIORI_SERIAL_NUMBERS_SRV/MATERIALSet('250')\",\"uri\":\"http://my.dev.int:8000/sap/opu/odata/sap/ZFIORI_SERIAL_NUMBERS_SRV/MATERIALSet('250')\",\"type\":\"ZFIORI_SERIAL_NUMBERS_SRV.MATERIAL\"},\"MATNR\":\"250\",\"MAKTX\":\"X:K10/MF250\"}}";
        var myjson = System.Text.Json.JsonSerializer.Deserialize<MyJson>(json);
        Console.WriteLine(myjson.D.MATNR);
    }
}

public class MyJson
{
    [JsonPropertyName("d")]
    public MetaData D {get; set;}
}

public class MetaData
{
   [JsonPropertyName("__metadata")]
   public MetaBase MetaB {get; set;}
   public string MATNR { get; set; }
   public string MAKTX { get; set; }    
    
}

public class MetaBase
{
   [JsonPropertyName("id")]
   public string ID {get; set;}
   [JsonPropertyName("uri")]
   public string Uri {get; set;}
   [JsonPropertyName("type")]
   public string Type {get; set;}
    
}
rpppsulh

rpppsulh2#

因为你只需要材料

Material material = System.Text.Json.Nodes.JsonNode.Parse(json)["d"].Deserialize<Material>();

相关问题