.NET的新手。仍然没有掌握如何做字典,列表,数组等。
我需要生成这个JSON才能与SugarCRM的REST API交流:
{
"name_value_list": {
"assigned_user_name": {
"name": "assigned_user_name",
"value": "joe"
},
"modified_by_name": {
"name": "modified_by_name",
"value": "jill"
},
"created_by_name": {
"name": "created_by_name",
"value": "jack"
}
}
}
来自这个C#POCO,与ServiceStack很好地配合使用:
public class lead {
public string assigned_user_name { get; set; }
public string modified_by_name { get; set; }
public string created_by_name { get; set; }
}
我必须为许多不同的类进行这种转换,所以我认为创建另一个强类型类是不明智的(ala Costomising the serialisation/serialised JSON in service stack)
我查看了ServiceStack文档,但也许我错过了某个地方的例子。
如何以可以扩展到其他ServiceStack POCO的方式构建此JSON?
答案 0 :(得分:3)
这会生成正确的JSON:
Dictionary<string, Dictionary<string, string>> nameValues = new Dictionary<string, Dictionary<string, string>>();
// Deal with all the properties on the object
IList<PropertyInfo> props = new List<PropertyInfo>(this.GetType().GetProperties());
foreach (PropertyInfo prop in props)
{
Dictionary<string, string> nameValue = new Dictionary<string, string>();
nameValue.Add("name", prop.Name);
object propValue = prop.GetValue(this, null);
if (propValue == null)
{
nameValue.Add("value", string.Empty);
}
else
{
nameValue.Add("value", prop.GetValue(this, null).ToString());
}
nameValues.Add(prop.Name, nameValue);
}
Dictionary<string, object> nameValuesArray = new Dictionary<string, object>();
nameValuesArray.Add("name_value_list", nameValues);
string jsonString = JsonSerializer.SerializeToString<Dictionary<string, object>>(nameValuesArray);
反射的东西是我以后可以在任何物体上使用它。
这只是为所需的JSON输出构建正确的字典 - 在这种情况下是字典 - &gt;字典 - &gt;字典。试错......:/
<强>更新强>
略微改变它(感谢paaschpa)使用通用的NameValue类,因为字典看起来很难看。我也有错误的要求。 JSON应该是这样的:
[
{
"name": "id",
"value": "60e03cb3-df91-02bd-91ae-51cb04f937bf"
},
{
"name": "first_name",
"value": "FancyPants"
}
]
你可以这样做:
public class NameValue
{
public string name { get; set; }
public string value { get; set; }
}
public class Lead
{
public string assigned_user_name { get; set; }
public string modified_by_name { get; set; }
public string modified_user_name { get; set; }
public List<NameValue> toNameValues()
{
List<NameValue> nameValues = new List<NameValue>();
IList<PropertyInfo> props = new List<PropertyInfo>(this.GetType().GetProperties());
foreach (PropertyInfo prop in props)
{
NameValue nameValue = new NameValue();
object propValue = prop.GetValue(this, null);
if (propValue != null && !String.IsNullOrEmpty(propValue.ToString()))
{
nameValue.name = prop.Name;
nameValue.value = propValue.ToString();
nameValues.Add(nameValue);
}
}
return nameValues;
}
}
我将原来的问题保留原样(以及我的上述答案)因为它仍然是一个合法的例子和正确的JSON。
答案 1 :(得分:1)
好吧,我不认为.NET词典,列表,数组等会有所帮助,因为你列出的JSON似乎没有任何数组(方括号)。我猜大多数.NET JSON序列化程序在遇到这些类型时将使用方括号。因此,我认为这会创建自己的类或执行某种类型的“字符串魔术”来生成您需要的JSON。
不完全确定如何使用ServiceStack与SugarCRM交谈,但是执行类似下面的操作应该让ServiceStack.Text.JsonSerializer生成您列出的JSON字符串。
public class NameValue
{
public string name { get; set; }
public string value { get; set; }
}
public class Lead
{
public NameValue assigned_user_name { get; set; }
public NameValue modified_by_name { get; set; }
public NameValue created_by_name { get; set; }
}
public class LeadRequest
{
public Lead name_value_list { get; set; }
}
public void JsonTest()
{
var req = new LeadRequest
{
name_value_list = new Lead
{
assigned_user_name = new NameValue {name = "assigned_user_name", value = "joe"},
modified_by_name = new NameValue {name = "modified_by_name", value = "jill"},
created_by_name = new NameValue {name = "created_by_name", value = "jack"}
}
};
var jsonReq = ServiceStack.Text.JsonSerializer.SerializeToString(req);
}
答案 2 :(得分:1)
您可以为lead
课程创建custom serializer。
JsConfig<lead>.SerializeFn = lead => {
// Use reflection to loop over the properties of the `lead` object and build a dictionary
var data = new Dictionary<string, object>();
foreach (var property in typeof(lead).GetProperties()) {
data[property.Name] = new {
name: property.Name,
value: property.GetValue(lead, null);
};
}
return data.ToJson();
};
您可以通过让以这种方式序列化的所有类实现标记接口(例如ISugarCrmRequest
)来为此通用化,并为该接口的所有实现注册此自定义序列化程序。