如何获取带有 $ 符号的 Json 变量



我一直在拉我的头发以获得$type变量。

jsonTxt.json

{
  "$type": "Things.YourThings.YourThingName, Things",
  "Name": "Doe"      
}

我试图将变量作为string,但没有成功。我只是得到null.

这是我的工作:

public class CustomName
{
  [JsonProperty("$type")]
  public string Type { get; set; }
  public string Name { get; set; }
}

然后

var customName = JsonConvert.DeserializeObject<CustomName>(jsonText);

实际上,我只想提取类型,该类型只是名称YourThingName

试试这个:

JObject obj = JObject.Parse(jsonText);
var customName = new CustomName()
{
    Name = obj["Name"].ToString(),
    Type = obj["$type"].ToString()
};

然后,要获得YourThingName,您可以使用正则表达式或仅String.Split

string name = Regex.Match(customName.Type, @"(?:.)(w*)(?:,)").Groups[1].ToString();

string name = customName.Type.Split(',')[0].Split('.')[2];

在访问不同的数组之前,必须进行边界检查,否则最终会出现IndexOutOfRange异常。

.Net Fiddle

另一种解决方案是将"$type"的所有出现替换为类似 "type" 的内容。

jsonText.Replace(""$type"", ""type"");

跟。。。

public class CustomName
{
  public string Type { get; set; }
  public string Name { get; set; }
}

。反序列化将按预期工作:

var customName = JsonConvert.DeserializeObject<CustomName>(jsonText);
var type = customName.Type;

Json.Net 提供了一个MetadataPropertyHandling设置,用于控制如何处理 JSON 中的$type$ref$id元数据属性。 默认情况下,它将使用这些,这意味着它们对您的类不可见。 但是,如果将此设置设置为 Ignore ,则 Json.Net 根本不会处理元数据属性,从而允许您正常处理它们。 您无需事先手动操作 JSON 字符串。

string json = @"
{
  ""$type"": ""Things.YourThings.YourThingName, Things"",
  ""Name"": ""Doe""      
}";
JsonSerializerSettings settings = new JsonSerializerSettings
{
    MetadataPropertyHandling = MetadataPropertyHandling.Ignore
};
CustomName cn = JsonConvert.DeserializeObject<CustomName>(json, settings);
Console.WriteLine("Type: " + cn.Type);    // Things.YourThings.YourThingName, Things
Console.WriteLine("Name: " + cn.Name);    // Doe

从那里你可以像这样提取短类型名称:

int i = cn.Type.LastIndexOf(", ");
int j = cn.Type.LastIndexOf(".", i);
string shortTypeName = cn.Type.Substring(j + 1, i - j - 1);
Console.WriteLine(shortTypeName);    // YourThingName

这个问题还有另一种(愚蠢的)解决方案。创建与 $type 属性中所述相同的类型并反序列化为该类型:

// Put this in a library project called "Things"
namespace Things.YourThings
{
     public class YourThingName
     {
         public string Name { get; set; }
     }
}

别处:

var customName = JsonConvert.DeserializeObject<Things.YourThings.YourThingName>(jsonText);
var type = customName.GetType().Name;

相关内容

  • 没有找到相关文章

最新更新