解析vcard json C#

解析vcard json C#,c#,json,vcf-vcard,C#,Json,Vcf Vcard,我想使用Json.NET解析vcard RFC 7095: ["vcard", [ ["version", {}, "text", "4.0"], ["fn", {}, "text", "John Doe"], ["gender", {}, "text", "M"], ["categories", {}, "text", "computers", "cameras"], ... ] ] 我尝试使用F

我想使用Json.NET解析vcard RFC 7095:

["vcard",
     [
       ["version", {}, "text", "4.0"],
       ["fn", {}, "text", "John Doe"],
       ["gender", {}, "text", "M"],
       ["categories", {}, "text", "computers", "cameras"],
       ...
     ]
   ]

我尝试使用FormatTypeFormatter执行此操作,但无法验证json。

您可以使用
JavaScriptSerializer
将其解析为
对象[]
,然后使用它来构建更好的复杂类型:

 var js = new JavaScriptSerializer();
 var o = (object[])js.Deserialize(@"[""vcard"",
   [
     [""version"", {}, ""text"", ""4.0""],
     [""fn"", {}, ""text"", ""John Doe""],
     [""gender"", {}, ""text"", ""M""],
     [""categories"", {}, ""text"", ""computers"", ""cameras""]
   ]
 ]", typeof(object[]));



if (o.length > 1 && (o[0] as string) == "vcard")
{
    var props = o[1] as object[];

    foreach (object[] values in props)
    {
        switch (values[0] as string)
        {
            case "version":
                ...
                break;
            case "fn":
                ...
                break;
            ....
        }
    }
}

您应该对此进行更多验证,但这是一个良好的开端。

显示一些代码和您收到的错误消息,因为这不是JSON对象,而是JSON数组。它可能需要
“键”:“值”
对。如果Json.NET不支持将Json数组作为顶级对象,那么如果您将整个内容包装在
{“jcard”:…}
中,即添加最外层的对象,则可能会将其作为一组嵌套数组。(基于Json.NET序列化吗?)。vCard是键值形式的结构化数据,JSON自然是键值。然而,我们却有一些可怕的数组滥用。希望它能很快被更好的东西压扁。@Rup一个键/值JSON对象不会很有效。同一vCard属性可能有多个实例(例如ADR)。@Michael OK,因此将key“address”的值设置为结构化地址数组,或者设置为单个地址对象或数组(视情况而定),您可以从类型中分辨出来(我真的不喜欢,但JavaScript结构中有先例)。更好的是,每个地址都有一个唯一的(家庭、办公室等),并使用键值(好的,需要标志来表示优先级)。乍一看,解析器将数据存储为从属性类型到值数组的键值映射,每个值都是一个结构:为什么不将其序列化以生成JSON?那会比这更好。