我试图将一些JSON内容解析为C#.对于更简单的情况,我在JSON.NET上取得了巨大的成功,并且非常感谢LINQ提供商提供的干净方法.这是一个例子,我在地图中下载有关图层的信息,并在一个叫做的类上填充一些属性(令人惊讶!)图层:
using (var client = new WebClient())
{
_content = client.DownloadString(_url.AbsoluteUri + OutputFormats.Json);
}
JObject json = JObject.Parse(_content);
IEnumerable<Field> fields = from f in json["fields"].Children()
select new Field(
(string)f["name"],
(string)f["alias"],
(EsriFieldType)Enum.Parse(typeof(EsriFieldType), (string)f["type"])
);
_fields = fields.ToList();
_displayFieldName = (string)json["displayField"];
Run Code Online (Sandbox Code Playgroud)
您可以查看此URL以获取该方法的JSON的详细信息:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/WaterTemplate/WaterDistributionNetwork/MapServer/1?f = json&pretty = true.但是当我需要将与地图图层关联的单个数据字段转换为DataTable甚至只是字典结构时,问题就出现了.问题是,与RSS提要或其他一致格式不同,字段名称和字段数量从地图图层更改为地图图层.这是我运行查询的一个例子:
[Test]
[Category(Online)]
public void Can_query_a_single_feature_by_id()
{
var layer = _map.LayersWithName(ObjectMother.LayerWithoutOID)[0];
layer.FindFeatureById("13141");
Assert.IsNotNull(layer.QueryResults);
}
Run Code Online (Sandbox Code Playgroud)
在layer.FindFeatureById中运行的代码是这个,包括我卡住的部分:
public void FindFeatureById(string id)
{
var queryThis = ObjectIdField() ?? DisplayField();
var queryUrl = string.Format("/query{0}&outFields=*&where=", OutputFormats.Json);
var …Run Code Online (Sandbox Code Playgroud) 我面临着编写一个框架来简化大型复杂对象库(ArcObjects)的工作.您建议创建此类框架的准则是什么?静态方法首选吗?你如何处理伐木等事情?您如何通过供应商可能引入的更改来证明您的框架代码?
我想到了我在NHibernate,log4net以及我从NLog和NetTopologySuite等项目中读过的代码的所有各种包装器和帮助器,我看到了很多好的方法,但说实话,我不知道从哪里开始.
顺便说一句 - 我在C#3.5工作,但它更多的是推荐的方法而不是语言.
背景
我正在使用一个带有各种丑陋角落的遗留数据库.一点是审计.有一个表列出了应具有审计跟踪的字段的表名/字段组合.例如,如果某个行的表名为"WORKORDER"而fieldname为"STATUS",那么每当Workorder.Status属性在应用程序中发生更改时,我都需要将行添加到审计表中.我知道这个方法:NH事件或拦截器,但是在我到达那个阶段之前我有一个问题需要弄清楚.
题
我需要知道的是如何获取单个持久化类的键/值对列表,其中包含(a)数据库字段名称和(b)类中的关联属性名称.因此,对于我的示例,我有一个名为Workorder的类与一个名为(毫无意外)WORKORDER的表相关联.我在该Workorder类上有一个名为CurrentStatus的属性.WORKORDER表中的匹配属性是STATUS.注意属性名称和表列名称不匹配?我需要知道属性名称才能访问审计的前后数据.但我还需要知道支持列名称,以便我可以查询愚蠢的遗留"AuditTheseColumns"表.
我试过的
在我的应用程序中,我将Workorder.CurrentStatus从"TS"更改为"IP".我查看我的审计跟踪表,看到跟踪了WORKORDER.STATUS列.因此,在调用Session.SaveOrUpdate(workorder)之后,我需要找到与STATUS列关联的Workorder属性,并执行Session.Save(auditRecord)告诉它旧的("TS")和新的("IP")值.
据我所知,您可以获得有关该课程的信息:
var fieldNames = new List<string>();
IClassMetadata classMetadata = SessionFactory(Resources.CityworksDatasource).GetClassMetadata(typeof(T));
int propertyCount = 0;
foreach (IType propertyType in classMetadata.PropertyTypes)
{
if (propertyType.IsComponentType)
{
var cp = (ComponentType)propertyType;
foreach (string propertyName in cp.PropertyNames)
{
fieldNames.Add(propertyName);
}
}
else if(!propertyType.IsCollectionType)
{
fieldNames.Add(classMetadata.PropertyNames[propertyCount + 1]);
}
propertyCount++;
}
Run Code Online (Sandbox Code Playgroud)
有关该表的信息:
var columnNames = new List<string>();
PersistentClass mappingMeta = ConfigureCityworks().GetClassMapping(typeof(T));
foreach (Property property in mappingMeta.PropertyIterator)
{
foreach (Column selectable in property.ColumnIterator)
{
if (columnNames.Contains(selectable.Name)) continue;
columnNames.Add(selectable.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
但不是在同一时间.有任何想法吗?我不知道在哪里看下一个.
我使用Json.net问题和答案查看了这个解析JSON,它接近我需要的东西.关键区别是我需要解析每个记录形成一行或多行的x,y对数组.这是我输入的一个例子
{
"displayFieldName" : "FACILITYID",
"fieldAliases" : {
"FACILITYID" : "Facility Identifier",
},
"geometryType" : "esriGeometryPolyline",
"spatialReference" : {
"wkid" : 4326
},
"features" : [
{
"attributes" : {
"FACILITYID" : "",
"OBJECTID" : 1,
},
"geometry" :
{
"paths" :
[
[
[-80.3538239379999, 27.386884271],
[-80.3538100319999, 27.3868901900001],
[-80.3538157239999, 27.3869008510001]
]
]
}
},
{
"attributes" : {
"FACILITYID" : "",
"OBJECTID" : 2,
},
"geometry" :
{
"paths" :
[
[
[-80.3538239379999, 27.386884271],
[-80.3538295849999, 27.3868948420001] …Run Code Online (Sandbox Code Playgroud) 我已经在FNH谷歌集团中发布了这个帖子,但这里是独家新闻:
我在遗留数据库中有一个具有复合ID的表.好吧,PK是暗示的,因为表实际上没有定义PK,但自然PK是WORKORDERID和IMAGEPATH列的组合:
CREATE TABLE [WORKORDERIMG](
[WORKORDERID] [varchar](50) NULL,
[IMAGEPATH] [varchar](250) NULL,
[WOTASKID] [numeric](10, 0) NULL,
[ATTACHEDBY] [nvarchar](100) NULL,
[COMMENTS] [nvarchar](256) NULL,
[DATETIMEATTACHED] [datetime] NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我定义了这个类映射:
/// <summary>
/// NHibernate mapping for workorder attachments
/// </summary>
public class AttachmentMap : ClassMap<Attachment>
{
public AttachmentMap()
{
SchemaIs(Resources.DatabaseSchema);
WithTable(ObjectNames.TableWorkorderAttachment);
UseCompositeId()
.WithKeyProperty(x => x.ParentId, "WORKORDERID")
.WithKeyProperty(x => x.FileLocation, "IMAGEPATH");
Map(x => x.AttachedByUser, "ATTACHEDBY").WithLengthOf(100).Nullable();
Map(x => x.AttachedOn, "DATETIMEATTACHED").Nullable();
Map(x => x.Comments).Nullable().WithLengthOf(256);
References(x => x.ParentWorkorder).FetchType.Join();
}
}
Run Code Online (Sandbox Code Playgroud)
对于这堂课:
public class Attachment
{
public …Run Code Online (Sandbox Code Playgroud)