解析从API更改JSON - 使用什么设计模式 - PHP

时间:2016-09-04 23:34:07

标签: php json design-patterns

我从API获取文章/文章。 JSON对象有所不同,有些文章具有其他一些文章没有的属性。

我需要遍历项目并操纵属性(如果已设置)。

解决这个问题的最佳方法是什么?

实际上现在我做的事情让我觉得很难看......

<asp:GridView ID="gridviewSLds" runat="server" CellPadding="0" ForeColor="#333333" GridLines="Both" AutoGenerateColumns="False" OnRowCreated="gridviewSLds_RowCreated">
    <AlternatingRowStyle BackColor="White" />
    <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
    <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
    <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
    <SortedAscendingCellStyle BackColor="#FDF5AC" />
    <SortedAscendingHeaderStyle BackColor="#4D0000" />
    <SortedDescendingCellStyle BackColor="#FCF6C0" />
    <SortedDescendingHeaderStyle BackColor="#820000" />
    <Columns>
        <asp:TemplateField ItemStyle-BorderWidth="0">
            <ItemTemplate>
                <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("Id") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="item" HeaderText="Metric" SortExpression="item" ReadOnly="false" />
        <asp:TemplateField HeaderText="Item">
            <ItemTemplate>
                <asp:TextBox onfocusin="select()" runat="server" Text='<%# Bind("item") %>'
                    ID="txtfocus" class="alertpopup" AutoPostBack="true"></asp:TextBox>
            </ItemTemplate>
            <HeaderStyle HorizontalAlign="Center" />
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Control Type">
            <ItemTemplate>
                <asp:TextBox onfocusin="select()" runat="server" Text='<%# Bind("itemCtrlType") %>'
                    ID="txtfocus2" class="modalpopup2" AutoPostBack="true"></asp:TextBox>
            </ItemTemplate>
            <HeaderStyle HorizontalAlign="Center" />
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
    </Columns>
</asp:GridView>

$(document).ready(function(){ $('.alertpopup').focus(function () { var itemvalue = $('.alertpopup').val(); alert(itemvalue); }); });

1 个答案:

答案 0 :(得分:1)

由于您的来源具有不可预测的形状,我不认为有任何方法可以解析数据。

你可以在一个单独的函数中抽象丑陋,这样你的主脚本就可以了:

$parsed = parseAPI($items);

如果使用$items = json_decode($apiResponse,true),则会得到一个数组而不是一个对象。然后,您可以使用数组上的+运算符和默认数组将所有API响应强制转换为相同的形状。

$defaultItem = [
    'salutation' => null,
    'eventDate' => null,
    'eventEndDate' => null,
    ...
];

现在,当您从API获取项目时,您可以执行以下操作:

$items = json_decode($apiResponse,true);
foreach($items as &$item) $item += $defaultItem;

现在$items的每个成员都拥有您期望的所有密钥。如果缺少任何密钥,则会插入$defaultItem匹配的密钥和值。