ฉันไม่แน่ใจว่าจะขอความช่วยเหลือได้อย่างไร และนี่เป็นเรื่องปกติที่ฉันเห็นด้วย ดังนั้นโปรดยกโทษให้ฉันด้วย ฉันจะพยายามอธิบายดังนี้:
• ฉันใช้ JSON โดยใช้ POST และรับออบเจ็กต์ไดนามิก ฉันต้องแปลงคุณสมบัติขาเข้าทั้งหมดในวัตถุไดนามิกเป็นตัวพิมพ์ใหญ่
• ฉันกำลังใช้สิ่งที่ฉันคิดว่าเป็นวิธีแก้ปัญหาที่หลบเลี่ยง ฉันกำลังแปลง JSON เป็นพจนานุกรมสตริง จากนั้นใส่ค่าลงในพจนานุกรมใหม่หลังจากแปลง Key เป็น Key.ToUpper() จากนั้นทำการดีซีเรียลไลซ์กลับเป็นวัตถุไดนามิก
โซลูชันที่ใช้งานได้ในปัจจุบันมีดังนี้:
string _StrJSON = @"{""FIELDA"" : ""1234"",""fieldb"" : ""OtherValue""}";
var d = JsonConvert.DeserializeObject<Dictionary<string, string>>(_StrJSON);
d.ContainsKey("FIELDB").Dump(); // returns false, obviously.
Dictionary<string, string> dr = new Dictionary<string, string>();
d.ToList().ForEach(r => dr.Add(r.Key.ToUpper(), r.Value));
dr.Dump("dr"); // FIELDA 1234 - FIELDB OtherValue
var a = JsonConvert.SerializeObject(dr);
a.Dump(); // {"FIELDA":"1234","FIELDB":"OtherValue"}
มันได้ผล
[แก้ไข] ความสับสนเกี่ยวกับ "var" ของฉันด้านบนและสิ่งอื่น ๆ ฉันชัดเจนมากว่าอะไรเป็นแบบไดนามิกและอะไรไม่ใช่ [/แก้ไข]
สิ่งที่ฉันได้ลองไปแล้วซึ่งใช้งานไม่ได้มีดังต่อไปนี้:
namespace Newtonsoft.Json
{
/// <summary>
/// Converts JSON keys to uppercase.
/// </summary>
public class UppercaseContractResolver : Serialization.DefaultContractResolver
{
#region Methods.
#region Public Methods.
/// <summary>
/// Resolves property name for this JSON object.
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
protected override string ResolvePropertyName(string key)
{
return key.ToUpper();
}
#endregion
#endregion
#region Constructors.
/// <summary>
/// Converts JSON keys to uppercase.
/// </summary>
public UppercaseContractResolver()
{
}
#endregion
}
/// <summary>
/// Wrapper for Newtonsoft.Json.JsonConvert for JSON keys as uppercase.
/// </summary>
public static class JsonConvertUpper
{
#region Members.
#endregion
#region Methods.
#region Public Methods.
/// <summary>
/// Tries to serialize specified object with JSON keys in upper case.
/// <para>e.g. "key":value should become "KEY":value by using this method.</para>
/// </summary>
/// <param name="value">Object.</param>
/// <returns></returns>
public static string SerializeObjectUpper(object value)
{
return JsonConvert.SerializeObject(value, new JsonSerializerSettings
{
ContractResolver = new UppercaseContractResolver()
});
}
/// <summary>
/// Tries to Deserialize specified object with JSON keys in upper case.
/// <para>e.g. "key":value should become "KEY":value by using this method.</para>
/// </summary>
/// <param name="strValue">String.</param>
/// <returns></returns>
public static object DeserializeObjectUpper(string strValue)
{
// DeserializeObject does not allow uppercase properties. So use SerializeObjectUpper and then deserialize.
var value = JsonConvert.DeserializeObject(strValue);
string strJSON = SerializeObjectUpper(value);
return JsonConvert.DeserializeObject(strJSON, new JsonSerializerSettings()
{
ContractResolver = new UppercaseContractResolver()
});
}
#endregion
#endregion
}
}
วิธีการเรียกใช้ข้างต้นจะเป็น:
dynamic json = JsonConvertUpper.DeserializeObjectUpper(_StrJSON);
if (json.CTN== null)
{...}
[แก้ไข] โปรดทราบว่าฉันไม่มีคลาสเนื่องจากคีย์ JSON จะต้องได้รับการปฏิบัติเหมือนเป็นตัวพิมพ์ใหญ่และคลาสและรหัสอื่น ๆ ฯลฯ ล้วนอยู่ใน ProperCase [/แก้ไข]
มีวิธีใดบ้างที่จะทำ ภายใน JsonConvert เลย? เพื่อหลีกเลี่ยงแพทช์แบบแมนนวลของฉัน? ความช่วยเหลือใด ๆ ที่ชื่นชม ขอบคุณ.
JsonProperty
ในชั้นเรียนของคุณ - person Ňɏssa Pøngjǣrdenlarp   schedule 03.03.2016